ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式之装饰者模式

2021-08-24 19:06:07  阅读:205  来源: 互联网

标签:Material tea material 模式 public 奶茶 new 设计模式 装饰


一 装饰者模式

      装饰者模式:动态的将责任附加到对象身上。若要扩展,装饰者模式比继承更加有弹性。

      装饰者模式秉承这一个开放,关闭原则。就是对扩展开放,对修改关闭,也就是说对该类可以做扩展,但是不可以修改该类的原始功能。

二  装饰者模式的示例

       这里我们列举一个奶茶店的例子。起初,这个奶茶店只卖普通茶。代码示例如下:

 先定义一个材料的接口:

public abstract class Material {
	
	String desc;
	
	public String getDesc(){
		return desc;
	}
	
	public abstract float cost();

}

再定义一个普通的茶:

public class Tea extends Material{
	
	public Tea(){
		this.desc = "普通的茶";
	}

	@Override
	public float cost() {
		// TODO Auto-generated method stub
		return 5.0f;
	}

}

如果有顾客来买茶的话,那么只需要new 一个Tea对象即可,后来奶茶店扩张了,种类多样了,开始卖奶茶了,还有珍珠奶茶等多种茶,那么这个时候,我们是否需要去创建奶茶以及珍珠奶茶等多个对象呢?如果按照这个思路创建下去的话,那么将来有一百种奶茶,那么势必得创建一百个java类然后继承Material,如此下来,到时候种类继续扩展,多糖少糖,多奶少奶等情况,会创建java类都弄的开发人员头皮发麻。那么针对于这种情况,便可以用到装饰者模式。

首先奶茶的材料就是牛奶加上普通的茶,多奶的奶茶就是多加一份或者多份牛奶。那么我们就可以定义一个牛奶的原料对象,代码如下:

public class Milk extends Material{
	
	private Material material;
	
	public Milk(Material material){
		this.material = material;
	}
	
	@Override
	public String getDesc(){
		return material.getDesc() + ", 牛奶";
	}

	@Override
	public float cost() {
		// TODO Auto-generated method stub
		return 1.0f+material.cost();
	}

}

如果需要珍珠奶茶的话,那么我们可以添加一个珍珠的原材料

public class Pearls extends Material{
	
	private Material material;
	
	public Pearls(Material material){
		this.material = material;
	}
	
	@Override
	public String getDesc(){
		return material.getDesc() + ", 珍珠";
	}

	@Override
	public float cost() {
		// TODO Auto-generated method stub
		return 1.5f + material.cost();
	}

}

如果需要一份多奶的珍珠奶茶的话,代码如下:

public class Test {
	
	public static void main(String[] args){
		Material tea = new Tea();
		tea = new Milk(tea);
		tea = new Milk(tea);
		tea = new Pearls(tea);
		System.out.println(tea.getDesc() + "; 价格是: "+ tea.cost());
		
	}

}


输出结果如下:

普通的茶, 牛奶, 牛奶, 珍珠; 价格是: 8.5

如果只需要一份奶茶的话,代码如下:

public class Test {
	
	public static void main(String[] args){
		Material tea = new Tea();
		tea = new Milk(tea);
		System.out.println(tea.getDesc() + "; 价格是: "+ tea.cost());
		//tea = new Milk(tea);
		//tea = new Pearls(tea);
		
	}

}

//输出结果如下:
普通的茶, 牛奶; 价格是: 6.0

三  装饰者模式总结

        由上述的案例我们可以理解,装饰者模式就是将牛奶,珍珠等原料加到普通的茶身上,从而得到奶茶,珍珠奶茶等多样的种类,而不是直接新增一个奶茶和珍珠奶茶的类。这种思想就是装饰者模式的思想。

标签:Material,tea,material,模式,public,奶茶,new,设计模式,装饰
来源: https://blog.csdn.net/weixin_49366997/article/details/119896045

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有