装饰器的作用就是在不改变原有代码的情况下进行修饰,为已经存在的对象添加额外的功能
设计模式共23种,分为三种类型
- 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
- 结构型模式:代理模式、装饰器模式、外观模式、享元模式、桥接模式、组合模式、适配器模式
- 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式
Look Here:如果你了解Java中继承特性的话,那么有助于你理解装饰者模式,简单的讲该模式借助了java的特性,类似子类继承父类后, 在自身的方法内通过调用super(父类实现)动态调整装饰的顺序与行为 ~
关于装饰器模式的设计原则
主要有以下俩点
- 多用组合,少用继承
- 对扩展开放,对修改关闭
任何一个事务有优点,也有缺点
优点
- 装饰类和被装饰类可以独立发展,而不会相互耦合
- 装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
缺点
- 多层装饰比较复杂
每一种设计模式,往往都有很多角色组成,尤其装饰者模式属于结构型模式,那么它的结果主要包含抽象构建者,具体构建者,抽象装饰类,具体装饰类,然后就是使用场景了
- 抽象构建者
可以采用接口或者抽象类定义需要装饰的方法 - 具体构建者(被装饰类)
一般为实现抽象装饰方法的容器类,内部包含装饰方法的具体实现 - 抽象装饰者
内部属性里必然有一个private变量指向抽象构建,并实现了装饰方法 - 具体装饰者
装饰类的实现应该可以说是装饰者模式的关键所在了,在装饰类中我们首先我们也需要实现抽象方法,同时需要传入被装饰者,之后在装饰方法中对装饰类进行装饰 - 客户端(使用方式)
仅代表使用场景和装饰者的调用方式
demo示例:我告诉了你现在的职业,但是你可听别人讲过我曾经的职业和未来想从事的职业?
抽象构建者(接口或抽象类)- Job
public interface Job {
//需要被装饰的方法
public void work();
}
具体构建者(被装饰类)- Me
public class Me implements Job {
@Override
public void work() {
System.out.println("我当前的职业是程序员");
}
}
抽象装饰者(接口或抽象类) - Decorator
public class Decorator implements Job {
private Job job;
public Decorator(Job job) {
this.job=job;
}
public void work(){
job.work();
}
}
具体装饰者 - OtherMe
public class OtherMe extends Decorator {
public Job job;
public OtherMe (Job job) {
this.job=job;
}
public void before(){
System.out.println("我以前的职业是幻想者");
}
@Override
public void work() {
before()
super.work();
System.out.println("我未来的职业是做梦者");
}
}
场景类 - 使用方式
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Me me = new Me();
Decorator otherMe = new OtherMe(me);
otherMe.work();
}
}
输出效果