设计模式 - 装饰器模式

357 阅读3分钟

装饰器的作用就是在不改变原有代码的情况下进行修饰,为已经存在的对象添加额外的功能

设计模式共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();
    }
}

输出效果
在这里插入图片描述