Java 装饰模式 (Decorator)「建议收藏」

Java 装饰模式 (Decorator)

大家好,又见面了,我是全栈君。

装饰模式

动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的取代方案

这里写图片描写叙述

代码

package gx.component;

/** * 组件:装饰类和被装饰类 都要继承:为了类型保持一致 * @author always * */
public abstract class Component {

    public abstract void description();
    public abstract int cost();
}

package gx.component.impl;

import gx.component.Component;


/** * 装饰类的抽象类 * @author always * */
public abstract class Decorator extends Component{

    protected Component component;
}
package gx.component.impl;

import gx.component.Component;

/** * * 被包装的类 * @author always * */
public class Phone extends Component{

    public void description() {
        System.out.println("裸机");
    }

    public int cost() {

        return 1900;
    }


}
package gx.decorator.impl;

import gx.component.Component;
import gx.component.impl.Decorator;

/** * * 装饰1:给手机买个壳 * @author always * */
public class DaiKe extends Decorator{

    public DaiKe(){

    }

    public DaiKe(Component component){
        this.component=component;
    }
    public void description() {
        this.component.description();
        System.out.println("带了手机壳");
    }

    public int cost() {
        return 50+this.component.cost();
    }

}
package gx.decorator.impl;

import gx.component.Component;
import gx.component.impl.Decorator;

/** * * 装饰2:给手机贴个膜 * @author always * */
public class TieMo extends Decorator{

    public TieMo(){}

    public TieMo(Component component){
        this.component=component;
    }

    public void description() {
        this.component.description();
        System.out.println("贴了膜");
    }

    public int cost() {
        return 20+this.component.cost();
    }

}

測试类:

package gx;

import gx.component.Component;
import gx.component.impl.Phone;
import gx.decorator.impl.DaiKe;
import gx.decorator.impl.TieMo;
import junit.framework.TestCase;

public class TestDecorator extends TestCase {

    public void testDecorator() {

        Component component = new TieMo(new DaiKe(new Phone()));

        component.description();
        System.out.println("价钱:" + component.cost());
        /* * 结果: * 裸机 * 带了手机壳 * 贴了膜 * 价钱:1970 */
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115420.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java基础学习总结(17)——线程

    Java基础学习总结(17)——线程

    2021年7月8日
    83
  • 双线性插值 一文全讲解

    双线性插值 一文全讲解1、原理在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。  越是简单的模型越适合用来举例子,我们就举个简单的图像:33的256级灰度图。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):2343822674…

    2022年5月5日
    53
  • linux安装samba服务器_开启samba服务

    linux安装samba服务器_开启samba服务Centos7samba的简介:我们都知道windows上面有一个很方便的文件共享的功能,samba服务主要就是实现了linux平台上的文件共享功能,使得linux平台也能够和windows进行文件共享,但是使用linux搭建的文件共享服务器对于windows来说和平常windows和windows之间进行文件共享没有什么区别。因为samba服务与windows的文件共享差不多,所以它的作用范围和windows的文件共享一样,只能在其所在的局域网生效。samba的主要配置文件1、/e

    2022年9月2日
    2
  • BCG界面库

    BCG界面库之前用过BCG界面库中的表格控件,深感其强大,现在再来用一下其它的。一.关于BCGControlBar。BCGControlBar是一个基于MFC的扩展库,您可以通过完全的用户化操作构成一些类似于M

    2022年7月3日
    29
  • 基础才是重中之重~你是否真正在用MVC路由功能~再续

    基础才是重中之重~你是否真正在用MVC路由功能~再续

    2022年3月12日
    40
  • java最长递增子序列_求数组最长递增子序列

    java最长递增子序列_求数组最长递增子序列[java]代码库packagecom.wzs;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;//求数组中最长递增子序列publicclassTest{publicstaticvoidmain(String[]args){inta[]={1,-1,2,-3,4,-5,6…

    2022年5月2日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号