设计模式之装饰者模式-以牛肉面为例

HeadFirst 设计模式中对装饰者模式的定义:

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

以下是HeadFirst 设计模式中关于装饰者模式的类图:

1、有一个抽象的组件(面条)。

2、有具体的组件实现(牛肉面、鸡蛋面)。

3、有进行装饰的类(加鸡蛋、加香肠,并且持有组件)。

示例代码如下:

组件基类(面条)

package iodemo;

/**
 * 
 * 面条基类
 */
public abstract class Noodle {

    public abstract int cost();

}

组件实现(牛肉面、鸡蛋面)

package iodemo;

/**
 * 牛肉面(一种具体的面条)
 *
 */
public class NiuRouNoodle extends Noodle {

    @Override
    public int cost() {
        System.out.println("牛肉面5元一碗");
        return 5;
    }
}
package iodemo;

/**
 * 刀削面(一种具体的面条)
 *
 */
public class DaoXiaoNoodle extends Noodle {

    @Override
    public int cost() {
        System.out.println("刀削面3元一碗");
        return 3;
    }

}

进行装饰的类(加鸡蛋、加香肠,并且持有组件)

package iodemo;

/**
 * 加鸡蛋(装饰)类,继承面条基类,对面条的方法进行包装,并且持有面条的引用
 *
 */
public class JiDanDecoratorNoodle extends Noodle {

    private Noodle noodle;

    public JiDanDecoratorNoodle(Noodle noodle) {
        this.noodle = noodle;
    }

    @Override
    public int cost() {
        System.out.println("加鸡蛋1元");
        return this.noodle.cost() + 1;
    }

}
package iodemo;

/**
 * 加(装饰)类,继承面条基类,对面条的方法进行包装,并且持有面条的引用
 * 
 * @author Administrator
 *
 */
public class XiangChangDecoratorNoodle extends Noodle {

    private Noodle noodle;

    public XiangChangDecoratorNoodle(Noodle noodle) {
        this.noodle = noodle;
    }

    @Override
    public int cost() {
        System.out.println("加香肠2元");
        return this.noodle.cost() + 2;
    }

}

测试类

package iodemo;

public class Test {

    public static void main(String[] args) {
        //低配版牛肉面
        NiuRouNoodle niuRouNoodle=new NiuRouNoodle();
        System.out.println(niuRouNoodle.cost());
        System.out.println("***************");
        //中配版牛肉面(加鸡蛋)
        JiDanDecoratorNoodle jiDanDecoratorNoodle=new JiDanDecoratorNoodle(niuRouNoodle);
        System.out.println(jiDanDecoratorNoodle.cost());
        System.out.println("***************");
        //顶配版牛肉面(加鸡蛋加香肠)
        XiangChangDecoratorNoodle xiangChangDecoratorNoodle=new XiangChangDecoratorNoodle(jiDanDecoratorNoodle);
        System.out.println(xiangChangDecoratorNoodle.cost());
        
        
        

    }

}

运行结果如下:

牛肉面5元一碗
5
***************
加鸡蛋1元
牛肉面5元一碗
6
***************
加香肠2元
加鸡蛋1元
牛肉面5元一碗
8

猜你喜欢

转载自www.cnblogs.com/silenceshining/p/10539862.html