目录
一、概念及原理
关于装饰者模式的概念我就不再赘述,这种模式算是一种更加灵活的继承吧,在实际的项目中有着广泛的应用,我用代码示例简单介绍一下,包含下面几个类:
- Aniaml:实际开发中用到的某个类的父类
- Tiger:实际开发中具体的某个类,也是要被修饰的类
- DecoratorTiger:用来修饰Tiger的修饰者
- MainClass:主程序入口类
Animal
public interface Animal {
void eat();
}
Tiger
public class Tiger implements Animal {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("Tiger eat grass!");
}
}
DecoratorTiger
public class DecoratorTiger implements Animal{
private Animal animal;
public DecoratorTiger(Animal animal) {
this.animal = animal;
// TODO Auto-generated constructor stub
}
@Override
public void eat() {
// TODO Auto-generated method stub
animal.eat();
System.out.println("no!no!Tiger is not eat grass!");
}
}
MainClass
public class MainClass {
public static void main(String[] args) {
Animal animal = new DecoratorTiger(new Tiger());
animal.eat();
}
}
很明显,通过DecoratorTiger的修饰,eat这个功能方法的内容有了变化,但是Animal和Tiger都没有进行改变,只是在DecoratorTiger类中对相关功能进行了丰富。
二、实际开发中的应用
其实,类似于上面的代码网上有很多,但是真正用到项目中的确不多。看懂了原理,但是不会用是很多小伙伴存在的问题。我在面试其他程序员的时候,经常会问到设计模式,几乎每个人都能把概念说的很好,感觉理解的很透彻。但是问道项目中实际应用的时候却是哑口无言。废话不多说,我来说一下装饰者模式在我的项目中的应用(项目为Android项目)
首先,创建一个抽象类。项目中不同模块的网络访问操作,我都会放在相应的控制器中,例如UserPresenter,FilePresenter等。而这些控制器全都继承于BasePresenter。有两点需要说明一下:(1)BasePresenter继承了Observable,是Java自带的观察者(关于观察者模式,我另一篇文章有介绍)(2)setOnResultListener方法是网络访问结果的回调,BasePresenter的子类都会实现这个类
public abstract class BasePresenter extends Observable{
public BasePresenter(){
}
public abstract BasePresenter setOnResultListener(OnResultListener onResultListener);
}
下面这个类就是装饰者模式的具体实现,主要代码就是在setOnREsultListener方法中。这个方法中有一个expireCheck方法,这个方法的作用就是做过期检查。也就是说,如果网络控制通过这个装饰器装饰后,都会先用户登录是否过期的检查操作。(是否过期就是用记录的过期时间和当前时间作比较)
public class ExpireCheckDecorator extends BasePresenter {
private OnResultListener mOnResultListener;
private Context mContext;
public ExpireCheckDecorator(Context context){
super();
mContext = context;
}
public ExpireCheckDecorator addPresenter(BasePresenter basePresenter){
basePresenter.setOnResultListener(mOnResultListener);
return this;
}
@Override
public ExpireCheckDecorator setOnResultListener(OnResultListener onResultListener) {
expireCheck();
mOnResultListener = onResultListener;
return this;
}
/**
* 过期检查
*/
private void expireCheck(){
if(SPTricks.use().getExpire(mContext)==0){
this.addObserver(ExpireObserver.getInstance());//添加观察者
this.setChanged();//设置已发生改变的状态
this.notifyObservers();//通知观察者
}
}
}
具体操作代码,当进行setOnResultListener时,就会进行过期的检查
mUserPresenter = new UserPresenter();
new ExpireCheckDecorator(this)
.setOnResultListener(mOnResultListener)
.addPresenter(mUserPresenter);
关于装饰者模式的内容就到这里,欢迎提问,欢迎纠错!