设计模式———装饰者模式

目录

一、概念及原理

二、实际开发中的应用


一、概念及原理

关于装饰者模式的概念我就不再赘述,这种模式算是一种更加灵活的继承吧,在实际的项目中有着广泛的应用,我用代码示例简单介绍一下,包含下面几个类:

  • 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);

关于装饰者模式的内容就到这里,欢迎提问,欢迎纠错!

猜你喜欢

转载自blog.csdn.net/qq_32019367/article/details/86108431