zoukankan      html  css  js  c++  java
  • 设计模式之装饰者模式

    装饰者模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。假如设计一个咖啡店的订单系统,咖啡有很多种,比如:HouseBlend,DarkRoast,Decaf 等等,同时,可以在咖啡里面加入很多调料,比如:豆浆(Soy),摩卡(Mocha)等等,这样会造成搭配方式有很多种,该如何来计算一杯咖啡的价格就成了问题,下面是最容易想到的办法。

    //定义咖啡的抽象类
    public abstract class Beverage {    
    
        String description = "Unknown Beverage";
        public String getDescription() {
            return description;
        }
        public abstract double cost();    
    }
    
    //加豆浆的HouseBlend
    public Class HouseBlendWithSoy extends Beverage {
    
        public HouseBlendWithSoy() {
            description = "HouseBlendWithSoy";
        }
        public double cost() {
            return 1.99;
        }
    }
    //加摩卡的DarkRoast
    public Class DarkRoastWithMocha extends Beverage {
    
        public DarkRoastWithMocha() {
            description = "DarkRoastWithMocha";
        }
        public double cost() {
            return 2.90;
        }
    }
    //..........

    显然如果这样通过构造类来逐个算价格是很累人的,并且不利于扩展,假如某个原料价格改变,就要改变很多类,

    下面用装饰者模式来解决这个问题:

    public abstract class Beverage {    
    
        String description = "Unknown Beverage";
        public String getDescription() {
            return description;
        }
        public abstract double cost();    
    }
    //定义调料的抽象类,让它继承Beverage
    public abstract class CondimentDecorator extends Beverage {
        public abstract String getDescription();
    }
    //这里很关键,让摩卡继承调料的抽象类,这样摩卡也是Beverage的子类,同时
    //在摩卡类里面用一个实例变量记录Beverage
    public class Mocha extends CondimentDecorator {
        Beverage beverage;
    
        public Mocha (Beverage beverage) {
            this.beverage = beverage;
        }
    
        public String getDescription() {
            return beverage.getDescription() + ", Mocha";
        }
    
        public double cost() {
            return 1.1 + beverage.cost();
        }
    }

    这里的继承作用在于让装饰者和被装饰者保持一样的类型,也就是有共同的超类,而不是利用继承获得“行为”,它的行为主要是通过装饰者与组件组合时会加入新的行为,是由组合对象而来。

  • 相关阅读:
    Linux中批量添加文件和修改文件小笔记
    scp 命令快速使用讲解
    使用Apache Spark 对 mysql 调优 查询速度提升10倍以上
    阿里云CentOS-7.2安装mysql
    yum安装网络配置图形界面
    忘记了root密码,如何进入系统?
    Linux学习之竿头直上
    Linux命令之初出茅庐
    Linux学习之要点必备
    阿里云CentOS7.2服务器的安装
  • 原文地址:https://www.cnblogs.com/fengz/p/6751987.html
Copyright © 2011-2022 走看看