用咖啡为模型解释一下装饰者模式


需求:对某个已经存在的方法进行功能增强
实现方案:
A、继承
B、装饰设计模式(重点)
C、动态代理(难点)
黑咖啡

加糖的 黑咖啡
加奶的 黑咖啡
加冰的 黑咖啡
加糖加奶的 黑咖啡
加糖加冰的 黑咖啡
加冰加奶的 黑咖啡
加糖加奶加冰的 黑咖啡
功能: 煮 + 喝

方案1:笨方案,使用继承,不建议,导致类爆炸
方案2:装饰模式
A、抽取接口
B、创建基类实现接口
C、创建要素类
class 要素类 implements 接口 {
private 接口 字段;
public 要素类(接口 字段){
this.字段 = 字段;
}
public void 接口方法(){
增强的功能
字段.方法();
}
}
使用:
不同要素类可以进行排列组合实现不同需求
优点:
避免继承的类爆炸的情况,代码结构更简单合理
缺点:
不同要素类可以任意组合,容易出现符合语法但是不符合业务逻辑的实现


代码实现:

public class Test02 {
public static void main(String[] args) {
Coffee c = new BlackCoffee();
SugerBlackCoffee sc = new SugerBlackCoffee(c);
sc.boil();
sc.drink();
System.out.println("---------------");
Coffee c2 = new BlackCoffee();
IceBlackCoffee ic = new IceBlackCoffee(c2);
ic.boil();
ic.drink();
System.out.println("+++++++++++++++++");
/*Coffee c3 = new BlackCoffee();
SugerBlackCoffee sc3 = new SugerBlackCoffee(c3);
MilkBlackCoffee mc3 = new MilkBlackCoffee(sc3);
IceBlackCoffee ic3 = new IceBlackCoffee(mc3);
ic3.boil();
ic3.drink();*/
IceBlackCoffee ic4 = new IceBlackCoffee(new SugerBlackCoffee(new MilkBlackCoffee(new BlackCoffee())));
ic4.boil();
ic.drink();
System.out.println("-------------------");
DoubleSuger ds = new DoubleSuger(new BlackCoffee());
ds.boil();
ds.drink();
}
}
//抽取接口
interface Coffee {
void boil();
void drink();
}
//创建黑咖啡类实现接口
class BlackCoffee implements Coffee {

@Override
public void boil() {
System.out.println("煮");
}

@Override
public void drink() {
System.out.println("黑咖啡");
}
}
//创建加糖黑咖啡类实现接口
class SugerBlackCoffee implements Coffee {
private Coffee coffee; //创建一个接口字段

//将接口作为方法的形参
public SugerBlackCoffee(Coffee coffee) {
this.coffee = coffee;
}
@Override
public void boil() {
coffee.boil();
}

@Override
public void drink() {
System.out.println("加糖");
coffee.drink();
}
}
//装饰设计模式和继承搭配使用
class DoubleSuger extends SugerBlackCoffee {

public DoubleSuger(Coffee coffee) {
super(coffee);
}
@Override
public void drink() {
System.out.println("两包");
super.drink();
}
}
=====================================================================
//创建加奶黑咖啡类实现接口
class MilkBlackCoffee implements Coffee {
private Coffee coffee;
public MilkBlackCoffee(Coffee coffee) {
this.coffee = coffee;
}
@Override
public void boil() {
coffee.boil();
}

@Override
public void drink() {
System.out.println("加奶");
coffee.drink();
}
}
//创建加冰黑咖啡类实现接口
class IceBlackCoffee implements Coffee {
private Coffee coffee;
public IceBlackCoffee(Coffee coffee) {
this.coffee = coffee;
}
@Override
public void boil() {
coffee.boil();
}

@Override
public void drink() {
System.out.println("加冰");
coffee.drink();
}
}

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值