设计模式之装饰器模式

装饰器模式

装饰器模式:在不改变被装饰类的结构的前提下,允许向。一个现有的对象添加新的功能。其实现原理是创建了一个装饰类依赖于被装饰类,为其添加新的功能。其作用于代理模式很像,代理依赖于继承,而装饰器采用组合。可以说代理模式可以隐藏内部实现的细节,而装饰器必须显示的传入其被装饰的对象。
这里写图片描述
抽象组件(Component):被装饰的抽象对象。
具体组件(ConcreteComponent):被装饰的具体组件
抽象装饰类(Decorator):拥有抽象组件的引用,和实现抽象组件的方法
具体装饰类(ConcreteDecorator):具体的装饰对象。

具体的例子

有一碗面,可以是牛肉面,羊肉面。。等,可以往里放辣椒,加醋。
CookingNoodle :煮面的接口(抽象组件)
CookingMuttonNoodle 和CookingBeefNoodle :牛肉面和羊肉面(具体组件)
NoodleDecorator:面条装饰器(抽象装饰器组件)
ChiliNoodleDecorator :加辣椒(具体装饰器)
VinegarNoodleDecorator :醋(具体装饰器)

/**
 * 煮面,定义抽象的组件
 * @author sky_
 *
 */
interface CookingNoodle {
    void cooking();
}

/**
 * 牛肉面,具体组件
 * @author sky_
 *
 */
public class CookingBeefNoodle implements CookingNoodle{

    @Override
    public void cooking() {
        System.out.println("牛肉面一碗");

    }

    public static void main(String[] args){
        CookingNoodle cookingNoodle = new ChiliNoodleDecorator(new CookingBeefNoodle());
        cookingNoodle.cooking();

        cookingNoodle = new VinegarNoodleDecorator(new CookingMuttonNoodle());
        cookingNoodle.cooking();
    }

}

/**
 * 羊肉面,具体的组件
 * @author sky_
 *
 */
class CookingMuttonNoodle implements CookingNoodle{

    @Override
    public void cooking() {
        System.out.println("羊肉面一碗");

    }

}


/**
 * 抽象的装饰类
 * @author sky_
 *
 */
class NoodleDecorator implements CookingNoodle{

    private CookingNoodle CookingNoodle;


    public NoodleDecorator(CookingNoodle cookingNoodle) {
        super();
        CookingNoodle = cookingNoodle;
    }


    @Override
    public void cooking() {
        CookingNoodle.cooking();
    }

}


class ChiliNoodleDecorator implements CookingNoodle{

    private CookingNoodle CookingNoodle;


    public ChiliNoodleDecorator(CookingNoodle cookingNoodle) {
        super();
        CookingNoodle = cookingNoodle;
    }


    @Override
    public void cooking() {
        CookingNoodle.cooking();
        addChili();
    }

    public void addChili(){
        System.out.println("加辣椒");
    }
}

class VinegarNoodleDecorator implements CookingNoodle{

    private CookingNoodle CookingNoodle;


    public VinegarNoodleDecorator(CookingNoodle cookingNoodle) {
        super();
        CookingNoodle = cookingNoodle;
    }


    @Override
    public void cooking() {
        CookingNoodle.cooking();
        addVinegar();
    }

    public void addVinegar(){
        System.out.println("加醋");
    }
}

运行结果
这里写图片描述
总结
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是用组合来代替继承实现类扩展功能的一个方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值