装饰器模式

  在实践生产中,新需求老是不断的出现。咱们能够直接修改已有的组件代码而且添加相应的功能,这显然破坏了已有组件的稳定性,修改完成后,整个组件须要从新测试。违背了开闭原则。设计模式

   咱们可使用继承方式,经过建立子类添加新功能实扩展。这种方法是静态的,用户不能控制增长行为的方式和时机。并且有些状况下继承是不可行的,例若有些组件被final修饰。另外,若是待添加的新功能存在多种组合方式 ,会致使大量的子类出现。例若有4个待添加的新功能,系统须要动态使用任意多个功能的组合,则须要添加15个子类才能知足需求。ide

装饰器模式可以帮助咱们解决上述问题。类图以下测试

                  

 

  假如如今有一块蛋糕,其它什么都不加,就是奶油蛋糕。若是加上草莓就是草莓蛋糕,若是加上巧克力,而后插上蜡烛,就变成了一块生日蛋糕了。不管是奶油蛋糕,草莓蛋糕,仍是生日蛋糕,它们的核心都是蛋糕。像这样不断的为对象添加装饰的设计模式被称为Decorator模式。UML 类图以下ui

代码以下this

package decorator;

/**
 * Created by dingshuangkun on 2018/1/27.
 * 蛋糕接口
 */
public interface Cake {

    /**
     * 涂抹奶油
     */
    void  makeCream();
    /**
     * 包装
     */
    void pack();

    /**
     * 生产蛋糕
     */
    void make();
}

 

package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.蛋糕
 * 奶油蛋糕
 */
public class CreamCake  implements Cake{

    @Override
    public void makeCream() {
        System.out.println("-------涂抹奶油-----");

    }

    @Override
    public void pack() {
        System.out.println("------包装----------");
    }

    @Override
    public void make() {
        makeCream();
        pack();
    }
}

 

package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.
 */
public  class Decorator implements Cake {

    private Cake cake;

    public Decorator(Cake cake) {
        this.cake = cake;
    }

    @Override
    public void makeCream() {
        cake.makeCream();
    }

    @Override
    public void pack() {
       cake.pack();
    }

    @Override
    public void make() {
        cake.make();
    }
}
package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.
 */
public class ChocolateCake extends Decorator {

    public ChocolateCake(Cake cake) {
        super(cake);
    }

    private void addChocolate(){
        System.out.println("-----添加巧克力-----");
    }
    @Override
    public void make() {
        addChocolate();
    }
}
package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.
 *
 * 水果蛋糕
 */
public class FruitCake extends Decorator {

    public FruitCake(Cake cake) {
        super(cake);
    }

    private void addFruit(){
        System.out.println("---添加水果---");
    }
    @Override
    public void make() {
        super.makeCream();
        addFruit();
    }
}

 

package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.
 * 生日蛋糕
 */
public class BirthdayCake extends Decorator {

    public BirthdayCake(Cake cake) {
        super(cake);
    }

    private void addCandle(){
        System.out.println("-----添加蜡烛-------");
    }
    @Override
    public void make() {
       addCandle();
       super.pack();
    }
}
package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.
 */
public class Client {

    public static void main(String[] args) {
        Cake cake = new CreamCake();
        cake = new Decorator(new FruitCake(cake));
        cake.make();
        cake = new Decorator(new ChocolateCake(cake));
        cake.make();
        cake = new Decorator(new BirthdayCake(cake));
        cake.make();
    }
}

运行结果设计

-------涂抹奶油-----
---添加水果---
-----添加巧克力-----
-----添加蜡烛-------
------包装----------code

Process finished with exit code 0
 对象

相关文章
相关标签/搜索