1.概述
所谓装饰,就是添加点特性或者说是行为,具体就是动态扩展对象功能,又称为包装模式。比如女生化妆。
2.UML结构图
image.png3.代码实现:以化妆为例
Costmeic:共同接口
/**
* Created by zhouwen on 2019/7/12
*/
public abstract class Costmeic {
public abstract void makeUp();
}
ConcreteCosmetic:被装饰者对象
/**
* Created by zhouwen on 2019/7/12
*/
public class ConcreteCosmetic extends Costmeic{
@Override
public void makeUp() {
Logger.getLogger("ConcreteCosmetic").info("简单化妆");
}
}
CosmeticDecorator:抽象装饰者,内部持有被装饰者的引用
/**
* Created by zhouwen on 2019/7/12
*/
public abstract class CosmeticDecorator extends Costmeic {
private Costmeic mCostmeic;
public CosmeticDecorator(Costmeic costmeic) {
mCostmeic = costmeic;
}
@Override
public void makeUp() {
mCostmeic.makeUp();
}
}
ConcreteCosmeticA:具体装饰者
/**
* Created by zhouwen on 2019/7/12
*/
public class ConcreteCosmeticA extends CosmeticDecorator {
public ConcreteCosmeticA(Costmeic costmeic) {
super(costmeic);
}
@Override
public void makeUp() {
super.makeUp();
heavyMakeup();
rouge();
}
private void rouge() {
Logger.getLogger("ConcreteCosmeticA").info("涂深红口红");
}
private void heavyMakeup() {
Logger.getLogger("ConcreteCosmeticA").info("加浓妆");
}
}
ConcreteCosmeticB:具体装饰者
/**
* Created by zhouwen on 2019/7/12
*/
public class ConcreteCosmeticB extends CosmeticDecorator {
public ConcreteCosmeticB(Costmeic costmeic) {
super(costmeic);
}
@Override
public void makeUp() {
super.makeUp();
heavyMakeup();
rouge();
}
private void rouge() {
Logger.getLogger("ConcreteCosmeticB").info("涂淡红口红");
}
private void heavyMakeup() {
Logger.getLogger("ConcreteCosmeticB").info("淡妆");
}
}
WrapperClient:场景类
/**
* Created by zhouwen on 2019/7/12
*/
public class WrapperClient {
public void test(){
Costmeic costmeic = new ConcreteCosmetic();
ConcreteCosmeticA concreteCosmeticA = new ConcreteCosmeticA(costmeic);
concreteCosmeticA.makeUp();
ConcreteCosmeticB concreteCosmeticB = new ConcreteCosmeticB(costmeic);
concreteCosmeticB.makeUp();
}
}
4.与代理模式的区别
装饰模式是对对象的功能扩展,而代理模式是对对象进行控制,不做扩展。
网友评论