当前位置: 首页 > news >正文

设计模式三:装饰者模式

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

设计原则:类应该对扩展开放,对修改关闭。

抽象组件Component :

Beverage类(可以是接口也可以是抽象类)

package com.sun;

public abstract class Beverage {
	String description = "Unknow Beverage";
	public String getDescription(){
		return description;
	}
	public abstract double cost();
}

具体组件ConcreteComponent:具体组件扩展自 Beverage类

DarkRost类

package com.sun;

public class DarkRost extends Beverage {
	
	public DarkRost(){
		description = "this is DarkRost";
	}
	public double cost() {
		return 0.88;
	}

}

Espresso类

package com.sun;

public class Espresso extends Beverage{
	public Espresso(){
		description = "Espresso";
	}
	public double cost(){
		return 1.99;
	}
}

HouseBlend类

package com.sun;

public class HouseBlend extends Beverage {
	
	public HouseBlend(){
		description = "House Blend Coffee";
	}
	public double cost() {
		return .89;
	}

}

 

抽象装饰者Decorator: 必须让 抽象装饰者能够取代Beverage,所以将抽象装饰者扩展自Beverage类

CondimentDecorator类

package com.sun;

public abstract class CondimentDecorator extends Beverage{
	public abstract String getDescription();
}

具体装饰者:

Mocha类

package com.sun;

public class Mocha extends CondimentDecorator {
	
	Beverage beverage;
	
	public Mocha(Beverage beverage){
		this.beverage = beverage;
	}
	public String getDescription() {
               /*因为Beverage对象已经被装饰过,所以这里不只是想描述被装饰者(例如DarkRost),而是连同装饰者都描述出来(例如“DarkRoast,Mocha”。所以首先利用委托的做法,得到一个叙述,然后在其后加上附加的叙述。*/
		return beverage.getDescription() +",Mocha";
	}

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

}

Whip类

package com.sun;

public class Whip extends Beverage {
	Beverage beverage;
	public Whip(Beverage beverage){
		this.beverage = beverage;
	}
	
	public String getDescription(){
		return beverage.getDescription() + ", Whip";
	}
	public double cost() {
		return 0.22 + beverage.cost();
	}

}

测试类:StarbuzzCoffee

package com.sun;

public class StarbuzzCoffee {
	public static void main(String[] args) {
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription()+"$" + beverage.cost());
		
		Beverage beverage2 = new DarkRost();
 	beverage2 = new Mocha(beverage2); //用Mocha装饰DarkRost对象
		beverage2 = new Whip(beverage2); //用第二个Mocha装饰DarkRost对象
		System.out.println(beverage2.getDescription()+"$" + beverage2.cost());
		
		Beverage beverage3 = new HouseBlend();
		beverage3 = new Whip(beverage3); //用Whip装饰HouseBlend对象
		beverage3 = new Mocha(beverage3); //用Mocha装饰HouseBlend对象
		System.out.println(beverage3.getDescription() + "$" +beverage3.cost());
	} 
}

测试结果:

Espresso$1.99
this is DarkRost,Mocha, Whip$1.3
House Blend Coffee, Whip,Mocha$1.31

可以利用工厂和生成器设计模式,能以更好的方式建立被装饰者对象。

转载于:https://my.oschina.net/u/3723612/blog/1615149

相关文章:

  • 为 Linux 实例安装图形化桌面
  • Centos7-Install-Jenkins
  • C# 在异步中使用HttpWebRequest出现的“正在终止线程”错误的解决方案
  • WMS—启动过程
  • linux文件压缩解压命令
  • iOS无限滑动轮播图可竖着滑动
  • Java递归拷贝文件夹
  • SSH.ASDM:远程管理
  • Adapter.notifyDataSetChanged与ListView.Post()刷新问题
  • SpringBoot几种定时任务的实现方式
  • Linux文件权限命令及配置
  • java判断集合list是为空
  • 升级的Electric Cloud平台增添了大型机和微服务功能
  • day16-示例:表单验证
  • c语言程序设计第6周编程作业一(分解质因数)
  • #Java异常处理
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Brief introduction of how to 'Call, Apply and Bind'
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Golang-长连接-状态推送
  • javascript面向对象之创建对象
  • Java精华积累:初学者都应该搞懂的问题
  • Java-详解HashMap
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • MySQL-事务管理(基础)
  • Nacos系列:Nacos的Java SDK使用
  • opencv python Meanshift 和 Camshift
  • Redux系列x:源码分析
  • supervisor 永不挂掉的进程 安装以及使用
  • Terraform入门 - 1. 安装Terraform
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue.js-Day01
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 老板让我十分钟上手nx-admin
  • 前端代码风格自动化系列(二)之Commitlint
  • 数组大概知多少
  • 一个项目push到多个远程Git仓库
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 容器镜像
  • ​TypeScript都不会用,也敢说会前端?
  • ()、[]、{}、(())、[[]]命令替换
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (转)JAVA中的堆栈
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET delegate 委托 、 Event 事件
  • .net MVC中使用angularJs刷新页面数据列表
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net 生成二级域名
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器