这是我参与更文挑战的第21天,活动详情查看:更文挑战
装饰模式
装饰模式又叫包装模式。它是继承关系的一种替代方案,通过新对象类来包装原对象类的扩展方式取代通过继承方式实现功能扩展形式。
装饰模式定义:动态给一个对象添加额外职责,比起继承生成子类会更加灵活些。
装饰模式角色:
- Component 抽象组件
- ConcreteComponent 组件具体实现类
- Decorator 抽象装饰
- ConcreteDecorator1 装饰具体实现类1
- ConcreteDecorator2 装饰具体实现类1
实战
Computer就是Component抽象组件;GameComputer是ConcreteComponent组件具体实现;ComputerBox是Decorator抽象装饰;PS4和PS5是装饰具体实现类。PS4和PS5两个具体装饰类实现通过包装原组件类实现对原方法game进行升级改造。抽象装饰在开发过程中若装饰类只是一个的情况下可以省略不计,但为了之后更好的扩展增加抽象装饰也是有所必要。装饰类在不改变原方法逻辑的基础上进行功能扩充,在类方法game中实现原有方法后和新逻辑方法封装整合到一起。
public abstract class Computer{
public abstract void game();
}
public class GameComputer extends Computer{
@override
public void game(){
// 玩游戏
}
}
public abstract class ComputerBox extends Computer{
protect Computer mComputer;
public ComputerBox(Computer computer){
this.mComputer = computer;
}
@override
public void game(){
mComputer.game();
// 玩游戏
}
}
public PS4 extend ComputerBox{
public PS4(Computer computer){
super(computer);
}
private void LoadGameAd(){
}
@override
public void game(){
super.game();
LoadGameAd();
}
}
public PS5 extend ComputerBox{
public PS4(Computer computer){
super(computer);
}
private void LoadGameInfo(){
}
@override
public void game(){
super.game();
LoadGameInfo();
}
}
复制代码
Android中的装饰模式
Context类上下文可以说是Android中使用装饰模式了。Context是一个抽象类定义了许多抽象方法,ContextImpl继承Context实现了Context的抽象方法。可以理解ContextImpl组件具体实现类。ContextWrapper则是装饰实现类,ContextWrapper实例化需要传入一个Context并在调用startActivity方法时调用mBase.startActivity。实质上ContextWrapper所有调用方法就是调用了ContextImpl对应方法。像是Activity、Servier、Application都是继承自ContextWrapper实现,不同之处在于他们装饰类实现方法有所差异主要也是对应他们服务自身的不同需求而有所不同。
public abstract class Context{
public abstract void startActivity(Intent intent);
....
}
public class ContextImpl extends Context{
@override
public void startActivity(Intent intent){
....
}
....
}
public class ContextWrapper extends Context{
Context mBase;
public ContextWrapper(Context context){
this.mBase = context;
....
}
@override
@override
public void startActivity(Intent intent){
mBase.startActivity(intent);
}
}
复制代码
总结
装饰模式和代理模式上有些类似,但两者还是有所差异,不能一概而论。装饰模式是一种包装原对象的形式取代继承对原对象进行升级扩展功能的模式;代理模式则为一个对象提供代理对象,由代理对象控制原有对象引用。装饰模式是对装饰对象功能增强,而代理模式只是对代理对象施加控制,不会影响或是对对象本身功能进行增强。