装饰者设计模式

装饰者模式的概念:动态的将新功能附加到对象上,在对象的扩展上来说,他比继承更加的具有弹性
这里举一个例子比如我们进行点奶茶,我们可以添加奶盖,珍珠,椰果很多种选择,如果我们按照类与类之间的排列组合有多少种情况进行类的编写,那么我们的代码十分的臃肿,而且会产生类爆炸的现象,因为我们每次新增加一个类,我们就会多很多种组合,那么不利于我们的编写
像这种附加新功能到对象上的情况,我们可以利用我们的装饰者设计模式
这里从网上找了一个例子,就是点咖啡案例

我们的装饰者大概实现,实际就是让装饰者和具体的主体继承同一个抽象的主体,并且我们把主体类型聚合到我们的装饰者里面,这样我们的装饰者就拥有了具体主体的方法进行递归叠加.
在这里插入图片描述
举个网上流传的例子,星巴克点咖啡的案例
package decorater;

public abstract class Drink {
private String des;
private int price;
public Drink() {

}
public String getDes() {
	return des;
}
public void setDes(String des) {
	this.des = des;
}
public int getPrice() {
	return price;
}
public void setPrice(int price) {
	this.price = price;
}
@Override
public String toString() {
	return "Drink [des=" + des + ", price=" + price + "]";
}
public Drink(String des, int price) {
	super();
	this.des = des;
	this.price = price;
}
public abstract int cost();
public abstract String des();

}
这是我们的抽象主体类,它里面有一个抽象描述方法和抽象价格方法,这是为了我们在子类进行实现,并且递归实现价格和描述的总和计算
package decorater;

public class Decorator extends Drink{
Drink drink;
public Decorator(Drink drink) {
this.drink=drink;
}
@Override
public int cost() {
// TODO Auto-generated method stub
return this.getPrice()+drink.cost();
}
@Override
public String des() {
return this.getDes()+drink.des();
}
}
这是我们的装饰者类,所有的具体的装饰者实现子类都继承它,我们可以注意到,我们这里聚合了主体类型的对象,进行调用其价格和描述,这里所用的是递归查询价格和描述,因为我们不管加多少东西,我们最后都可以看做饮料钱加调料钱.
这里插句题外话递归:我认为递归就是分为若干个相同的子问题,比如汉诺塔,二叉树的前序中序后序遍历, 斐波那契数列,爬楼梯,快排,归并排序等等都是很经典的递归案例,把它拆分成相同的子问题,进行实现,使得我们的代码更加简洁
这里的价格和描述最后就是递归,如上所说就是饮料加调料,(饮料+调料)+调料,
((饮料+调料)+调料)+调料,其实就是相同的子问题
package decorater;

public class Coffee extends Drink{
public Coffee() {
}
@Override
public int cost() {
return this.getPrice();
}
@Override
public String des() {
return this.getDes();
}
}
这是我们的被装饰者对象总类,以后我们的各种coffee都可以继承它,来进行扩展.
package decorater;

public class MilkCoffee extends Coffee{
public MilkCoffee() {
this.setDes(“牛奶咖啡”);
this.setPrice(10);
}
}
比如这就是具体的被装饰者类的具体类
package decorater;

public class Chocolate extends Decorator{
public Chocolate(Drink drink) {
super(drink);
this.setDes(“加巧克力”);
this.setPrice(5);
}
}
这是装饰者类的具体类
在这里插入图片描述
这是我们的打印结果,如果我们要新增一个coffee或者新增一个调料都很方便,这也实现了我们设计模式的OCP原则,对扩展开放,对修改关闭,在我们的IO流就用到了这种思想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值