装饰模式
首先装饰模式不是代码,是一种编写逻辑思想。
适合场景:一个人点餐。碗筷必需品,其他的都可以随意添加。
他方理解:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
我的理解:保存最基础的功能,其他类做出对应补充
具体例子:
- 创建一个超类,所有的类都继承或实现。可以定义成接口类型
package com.dawn.design.decorate;
/**
* @Auther: dawn
* @Date: 2020/1/13 11:02
* @Description: 超类 吃
*/
public abstract class Eat {
protected void pre() {}
protected void after(){}
}
- 基础类 和超类进行绑定关系
package com.dawn.design.decorate;
/**
* @Auther: dawn
* @Date: 2020/1/13 11:08
* @Description:
*/
public class BaseEat extends Eat {
@Override
protected void pre() {
System.out.println("第一准备碗筷");
}
@Override
protected void after() {
System.out.println("运动员正在玩");
}
}
- 最终应用类
package com.dawn.design.decorate;
/**
* @Auther: dawn
* @Date: 2020/1/13 11:10
* @Description: 篮球运动员
*/
public class FatterEat extends Eat{
Eat eat ;
public FatterEat(Eat eat) {
this.eat = eat;
}
@Override
protected void pre() {
eat.pre();
doSomething();
}
@Override
protected void after() {
eat.after();
}
void doSomething(){
System.out.println("胖的,想先吃两个热狗先");
}
}
package com.dawn.design.decorate;
/**
* @Auther: dawn
* @Date: 2020/1/13 11:25
* @Description:
*/
public class ThinEat extends Eat {
Eat eat;
public ThinEat(Eat eat) {
this.eat = eat;
}
@Override
protected void pre() {
eat.pre();
thinDoing();
}
@Override
protected void after() {
eat.after();
}
void thinDoing(){
System.out.println("苗条的人 想安静的等待别人点单");
}
}
- 测试类
package com.dawn.design.decorate;
/**
* @Auther: dawn
* @Date: 2020/1/13 11:12
* @Description:
*/
public class TestEat {
public static void main(String[] args) {
/**
* 第一准备碗筷
* 胖的,想先吃两个热狗先
*/
Eat eat = new FatterEat(new BaseEat());
eat.pre();
/**
* 第一准备碗筷
* 苗条的人 想安静的等待别人点单
*/
Eat e = new ThinEat(new BaseEat());
e.pre();
/**
* 第一准备碗筷
* 胖的,想先吃两个热狗先
* 苗条的人 想安静的等待别人点单
*/
Eat e2 = new ThinEat(new FatterEat(new BaseEat()));
e2.pre();
}
}
总结
优点: 方便方法的扩展,不想extends增加代码冗余量。可以针对不同的个体创建不同的行为数据
缺点: 每次使用会创建许多对象。过多的小类会让我们的系统变得很复杂。对内存考验极大。
结束语
装饰器模式有利有弊(更多的是利大于弊),我们可以好好思考装饰者模式应用场景,然后进一步掌握这种设计思想。