设计模式装饰者模式(DecoratorPattern)

核心模块:抽象组件,具体组件,抽象装饰者,具体装饰者

所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git

使用场景:给对象增加额外行为,用于替代继承的技术,动态给对象增加额外职责;
优点:符合opc原则,可以重复装饰,提供了一个比继承更加灵活的方式,不会导致类的个数急剧增加;
缺点:会产生许多小对象,灵活的同时也意味者比继承更加容易出错;
注意:

1,实际上就是新建一个类,包裹了目标类,新建类和目标类的行为一致;

2,装饰者模式与代理模式相同点:装饰者和被装饰者、代理类和真实代理类都实现通一个接口,可以在真实对象方法前面或者后面加上自定义方法;
3,装饰者模式与代理模式不同点:装饰者模式中被装饰对象是当作参数传入进来的,而且代理模式,一般只代理一个类,通常这个类在代理类的内部实例化;代理类和被代理类的关系通常编译时就被确定了,而装饰者和被装饰者的关系运行时被递归构造;

/**
 * Created by tory on 2018/1/6.
 * 装饰者模式
 * 就是在已有的类包裹一层
 */
public class DecoratorPattern {
    public static void main(String[] args) {
        FishFlavoredPork dish1 = new FishFlavoredPork();
        RiceDecorator rice = new RiceDecorator(dish1);
        PackageDecorator pack = new PackageDecorator(rice);
        System.out.println("--->"+pack.getDescription()+" -->共计:"+pack.coast()+" 元");
    }
}

//Component抽象构件
abstract class Component {
    protected String description = "";
    String getDescription(){
        return description;
    }

    abstract public Double coast();
}

//ConcreteComponent具体构件
class FishFlavoredPork extends Component {
    FishFlavoredPork() {
        description = "鱼香肉丝";
    }

    public Double coast() {
        return 12.9;
    }
}

//ConcreteComponent具体构件
class TwiceCookPork extends Component {

    TwiceCookPork() {
        description = "回锅肉";
    }

    public Double coast() {
        return 9.9;
    }
}

//Decorator抽象装饰者
abstract class Decorator extends Component {
    Component component;

    Decorator(Component component) {
        this.component = component;
    }

    abstract String getDescription();
}

//ConcreteDecorator 具体装饰者
class PackageDecorator extends Decorator {
    //在愿基础上增加餐盒
    PackageDecorator(Component component) {
        super(component);
    }

    @Override
    String getDescription() {
        return component.getDescription() + " ,餐盒";
    }

    @Override
    public Double coast() {
        return component.coast() + 2;
    }
}

//ConcreteDecorator 具体装饰者
class RiceDecorator extends Decorator {
    //增加米饭修饰
    RiceDecorator(Component component) {
        super(component);
    }

    @Override
    String getDescription() {
        return component.getDescription() + " ,米饭";
    }

    @Override
    public Double coast() {
        return component.coast() + 2.0;
    }
}

//ConcreteDecorator 具体装饰者
class SmallDishes extends Decorator {
    SmallDishes(Component component) {
        super(component);
    }

    @Override
    String getDescription() {
        return component.getDescription() + " ,小菜";
    }

    @Override
    public Double coast() {
        return component.coast() + 1;
    }
}

内容打印
Hello World!
--->鱼香肉丝 ,米饭 ,餐盒 -->共计:16.9 元

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值