你的位置:首页 > Java教程

[Java教程]设计模式之装饰者模式(JAVA)二


     上次简单说了一下什么是装饰者模式以及装饰者模式的一些特点,这次接着说装饰者模式的应用。

  主要参与的类或者接口

    1.component:修饰者和被修饰者共同继承的类,定义了装饰者和被装饰者需要实现的方法,可以单独的使用,也可以被修饰者包裹起来使用。

    2.concreteComponent:让修饰者为自己添加功能的对象,也就是最终被修饰的对象或者说是需要动态加上新行为的对象。

    3.Decorator:是具有特定装饰功能的类,用来修饰被装饰者,可以是抽象类也可以是接口,是所有装饰者共同实现的接口。

   二、装饰者模式实现图例

  

有了被装饰者,下面是装饰者,首先是Decorator,代码如下:

public abstract class DecoratIceCream extends IceCream{  @Override  public abstract void makeIceCream();  }

然后是ConcreteDecorator,当然ConcreteDecorator需要继承共同的Decorator,下面是两个ConcreteDecorator:

public class FruitIceCream extends DecoratIceCream{  IceCream iceCream;    public FruitIceCream(IceCream iceCream) {    this.iceCream = iceCream;  }  @Override  public void makeIceCream() {    this.iceCream.makeIceCream();    System.out.println("添加了水果");  }}

public class ChocolateIceCream extends DecoratIceCream{  IceCream iceCream;    public ChocolateIceCream(IceCream iceCream) {    this.iceCream = iceCream;  }  @Override  public void makeIceCream() {    this.iceCream.makeIceCream();    System.out.println("添加了巧克力");      }}

下来我们可以测试一下:

public static void main(String[] args) {    System.out.println("测试装饰者模式。。。。。");        /**     * 测试被装饰者--可以单独使用     */    IceCream ic=new MakeIceCream();    ic.makeIceCream();    System.out.println("");        /**     * 只添加一个装饰者     */    DecoratIceCream dic=new FruitIceCream(ic);    System.out.println("测试单个装饰者开始。。。");    dic.makeIceCream();    System.out.println("测试单个装饰者结束。。。");    System.out.println("");    /**     * 测试添加多个装饰者    */     DecoratIceCream dic1=new ChocolateIceCream(new FruitIceCream(ic));    System.out.println("测试多个装饰者开始。。。");    dic1.makeIceCream();    System.out.println("测试多个装饰者开始。。。");    System.out.println("");  }

运行结果如下:

  通过结果我们可以看到,单独的component也是好使的,使用修饰者包裹着component也是好使的,并且修饰者可以不止一个。

  

  四、简化模式

  1.如果只有一个ConcreteDecorator的时候,比如说我这家工厂只生产水果冰激凌,这时候怎么搞呢?

    这个时候可以将ConcreteDecorator和Decorator进行合并,合并之后的模型图如下(图片的来源大家都懂的啊):

    

被修饰者类是没有什么变化的,修饰者类变化也不大吧,下面上代码:

public class Decorator implements Component{  Component component;    public Decorator(Component component) {    this.component=component;  }  public void makeIceCream() {    component.makeIceCream();    System.out.println("添加了奶油");  }}

本来是要生产水果冰激凌的,但是一不小心生产成奶油的,大家将就吃吧。因为只生产一种,所以Decorator就不需要其他类继承了,直接二合一即可。下面上测试代码:

public class Main {  public static void main(String[] args) {        /**     * 测试Component     */    Component c=new ConcreteComponent();    c.makeIceCream();    System.out.println("");    /**     * ConcreteDecorator和Decorator合并后     */    Decorator d=new Decorator(c);    d.makeIceCream();    System.out.println("");  }}

运行结果:

 

2.另一种简化模式就是只有一个Concrete Component类而没有抽象的Component接口,这时可以让Decorator继承Concrete Component。模型如下:

 

四川旅游报价价格四川旅游景点推荐四川旅游团报价四川旅游团购优惠四川旅游线路报价内蒙古旅游注意事项 成吉思汗陵墓在哪_鄂尔多斯成吉思汗陵墓地理位置怎么走 太湖在哪个省_苏州太湖国家湿地公园、无锡市太湖鼋头渚风景区交通信息 冠豸山门票_龙岩连城冠豸山门票价格多少钱 九寨沟安全注意事项 去稻城亚丁旅游应注意什么_去稻城亚丁旅游注意事项 稻城亚丁美食大攻略好吃惨了 九寨沟美食-糌粑 窦团山官网?江油窦团山门票怎么预订? 窦团山好玩么?江油窦团山图片介绍? 自驾窦团山旅游攻略?红油窦团山路好走吗? 成都到窦团山自驾攻略?成都窦团山开车怎么去? 南昌美食小吃有哪些 从西安到太白山怎么走? 老哈尔滨人家里都有的物件:三五牌台钟 去九寨沟旅游坐飞机和汽车哪个更好呢? 2N7000RLRA Datasheet 2N7000RLRA Datasheet 2N7000RLRAG Datasheet 2N7000RLRAG Datasheet 2N7000TA Datasheet 2N7000TA Datasheet 永定土楼门票 永定土楼门票 永定土楼门票 坐飞机什么东西不能带 坐飞机什么东西不能带 坐飞机什么东西不能带 深圳野生动物园门票价格 深圳野生动物园门票价格 深圳野生动物园门票价格