前言:什么叫设计模式?
设计是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目的是实现代码的高内聚和低耦合。
装饰模式
一、定义
指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。
二、特点
1.装饰者和被装饰者有相同的超类。
2.你可以用一个或多个具体装饰包装一个对象。
3.装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。(类似代理模式)
4.对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。
三、例子
1、创建共同的超类
public interface House {
//房子可以住人
void live();
}
2、创建具体的被装饰对象(如:一间大房子)
public class BigHouse implements House{
private static final String TAG = "BigHouse";
@Override
public void live() {
Log.i(TAG, "====live=====");
}
}
3.创建装饰者(装饰器)
public class Decorator implements House {
private static final String TAG = "Decorator";
//用于持有被装饰者的引用
private final House mHouse;
//传递被装饰对象
public Decorator(House house) {
mHouse = house;
}
@Override
public void live() {
//执行装饰任务,如给房子装上一个花圃
Log.i(TAG, "=========装上一个花圃===========");
//调用被装饰者的方法
mHouse.live();
}
}
4.运行结果
public class DecorateTest {
public static void main(String[] args) {
//创建一个被装饰的对象
BigHouse my_house = new BigHouse();
//通过装饰者模式装饰
Decorator my_house_decorated = new Decorator(my_house);
my_house_decorated.live();
}
}
四.优缺点
优点:
(1)通过组合而非继承的方式,动态地扩展一个对象的功能,在运行时可以选择不同的装饰器从而实现不同的功能。
(2)有效的避免了使用继承的方式扩展对象功能而带来的灵活性差、子类无限制扩张的问题。
(3)具体组件类与具体装饰类可以独立变化,用户可以根据需要新增具体组件类跟装饰类,在使用时在对其进行组合,原有代码无须改变,符合"开闭原则"。
缺点:
(1)因为所有对象均继承于基类(超类),所以如果超类内部结构发生改变,则不可避免地影响到所有子类(装饰者与被装饰者)。如果基类改变,则势必影响对象的内部。
(2)装饰模式比继承更容易出错,排错也比较困难。对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为繁琐。所以一般只在必要的时候使用装饰者模式。
(3)装饰层数不能过多,否则会影响效率。