版权声明: https://blog.csdn.net/weixin_40072979/article/details/83624955
装饰器模式就像一个房子,要装修,要放家具,放各种装饰品一样的。每个都是一个独立的单元,把这些小的单元重新组合就可以变成一个新的东西。他的好处就是被一个复杂的事务拆分成很多小的部件,非常灵活。
举一个例子:
我们需要调一杯带蔗糖的咖啡,和一杯加入牛奶的咖啡;
1:共同的特性是他们都是饮料,这个饮料他有名字,有说明(价格等):定义一个Drink接口,
2: 这个饮料再具体点是一个咖啡,Coffee就是Drink的一个具体对象,同样有名字,说明等
3: 我们调制的新东西是需要在咖啡上进行的,都需要继承Coffee, 后续我们需要知道这个新产品的名字,说明等(价格),我们需要调用它的属性,所以需要引用Drink,读取Drink设置的属性;
4:我们需要调制的新产品只需要在3的基础上去调整就行了,就算是关于咖啡的一万种产品,也只需要在3的基础上操作。
package com.jianshun;
/**
* 模拟咖啡
* 1:抽象组件:需要装饰的抽象对象(接口或者抽象父类)
* 2:具体组件:需要装饰的对象
* 3:抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法
* 4:具体装饰类:被装饰的对象
* @author fanfan
*/
public class DecorateTeset2 {
public static void main(String[] args) {
Drink coffee = new Coffee();
Drink suger = new Suger(coffee);//装饰
System.out.println(suger.info()+"-->"+suger.cost());
Drink milk = new Milk(coffee);;//装饰
System.out.println(milk.info()+"-->"+milk.cost());
}
}
//抽象组件
interface Drink{
double cost();//费用
String info();//说明
}
//具体组件
class Coffee implements Drink{
private String name="原味咖啡";
@Override
public double cost() {
return 10;
}
@Override
public String info() {
return name;
}
}
//抽象装饰类
abstract class Decreate extends Coffee{
private Drink drink;
public Decreate(Drink drink) {
this.drink = drink;
}
@Override
public double cost() {
return this.drink.cost();
}
@Override
public String info() {
return this.drink.info();
}
}
//具体装饰类
class Milk extends Decreate{
public Milk(Drink drink) {
super(drink);
}
@Override
public double cost() {
return super.cost()*4;
}
@Override
public String info() {
return super.info()+"加入牛奶";
}
}
class Suger extends Decreate{
public Suger(Drink drink) {
super(drink);
}
@Override
public double cost() {
return super.cost()*2;
}
@Override
public String info() {
return super.info()+"加入了蔗糖";
}
}