软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 开发杂谈 -> 装饰模式 -> 正文阅读
开发杂谈 最新文章
BloomFilter
大学四年编程之历程
内核分析
造人论坛——意识的本质和一个人工脑模型
OFDM信号[matlab描述]
人类还会进化吗?
HDUACM1035RobotMotion简单模拟题
树、二叉树(二)
iisphpweb.config处理404,500等,跳转友好
DatabaseAsaFortress

[开发杂谈]装饰模式

  2016-04-03 20:47:27

设计原则:类应该对扩展开放,对修改关闭(开闭原则)。
装饰着模式:动态的将责任添加到对象上。若要扩展功能,装饰着将比继承更有弹性。
装饰着模式类图如下:

下面是关于装饰模式的一个典型示例:来自Head First的装饰者模式Demo(星巴兹咖啡):

package com.zjut.json.decoratorPattern;

/**
 * 装饰模式抽象组件
 * 
 * @author json
 *
 * @date 2013-5-6
 */
public abstract class Beverage {
    
    private String description = "Unknown Beverage";
    
    public String getDescription(){
        return description;
    }
    
    public void setDescription(final String description){
        this.description = description;
    }
    
    public abstract double cost();

}



package com.zjut.json.decoratorPattern;

/**
 * 浓缩咖啡-具体组件
 * 
 * @author json
 *
 * @date 2013-5-6
 */
public class Espresson extends Beverage {
    
    /**
     * 增加具体咖啡描述
     */
    public Espresson(){
        setDescription("Espresson");
    }

    @Override
    public double cost() {
        return 1.99;
    }

}



package com.zjut.json.decoratorPattern;

/**
 * 具体组件
 * 
 * @author json
 *
 * @date 2013-5-6
 */
public class HouseBlend extends Beverage {

    public HouseBlend(){
        setDescription("House Blend Coffee");
    }
    
    @Override
    public double cost() {
        return .98D;
    }

}



package com.zjut.json.decoratorPattern;

/**
 * 装饰者接口
 * 
 * @author json
 *
 * @date 2013-5-6
 */
public abstract class CondimentDecorator extends Beverage {

    public abstract String getDescription();
}



package com.zjut.json.decoratorPattern;

/**
 * @author json
 *
 * @date 2013-5-6
 */
public class Mocha extends CondimentDecorator {
    
    /**被装饰着*/
    private Beverage beverage;

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }

    @Override
    public double cost() {
        return beverage.cost() + .20D;
    }

    public Beverage getBeverage() {
        return beverage;
    }

    public void setBeverage(Beverage beverage) {
        this.beverage = beverage;
    }
    
}



package com.zjut.json.decoratorPattern;

/**
 * @author json
 *
 * @date 2013-5-6
 */
public class StarbuzzCoffee {

    public static void main(String[] args){
        Beverage decorated = new Espresson();
        Mocha decorator = new Mocha();
        decorator.setBeverage(decorated);
        System.out.println(decorator.cost());
        
        //双份摩卡
        Mocha doubleDecorator = new Mocha();
        doubleDecorator.setBeverage(decorator);
        System.out.println(doubleDecorator.getDescription() + ": " + doubleDecorator.cost());
    }
}


在这个例子中,装饰者和被装饰着共同继承与抽象组件Beverage,但不同之处在于,装饰者继承抽象组件的是类型,而不是行为,而行为的继承是利用组合,即在具体装饰者对象中存在了一个被装饰者的引用,将被装饰者的行为委托给这个引用。
 
人生最可贵的事情是sb似的坚持于追求……
上一篇文章      下一篇文章      查看所有文章
2016-04-03 20:46:48  
360图书馆 论文大全 母婴/育儿 软件开发资料 网页快照 文字转语音 购物精选 软件 美食菜谱 新闻中心 电影下载 小游戏 Chinese Culture
生肖星座解梦 人民的名义 人民的名义在线看 三沣玩客 拍拍 视频 开发 Android开发 站长 古典小说 网文精选 搜图网 天下美图
中国文化英文 多播视频 装修知识库
2017-4-24 13:24:44
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --