装饰者模式:我们在程序中处理业务过程中会出现很多需求,人的欲望是无止境的,当你的程序写完了,需求又提出这里再增加一些功能,这种情况非常常见,比如,目前实现了查询账单的功能,在这基础上,又要增加账单排序的功能,过一段时间又要实现账单的优化功能。这样的需求不断,我们一种做法是继承,创建好多子类,这样会出现类过多类膨胀的。因此就 装饰者模式应运而生。
装饰者模式的核心是装饰者和被装饰者实现相同的接口(这个接口是被装饰者的接口),所有的装饰者都继承自一个抽象类,这个抽象类实现了被装饰者的接口,并维护了一个有参的构造方法和被装饰者接口的类型的属性,通过构造方法来实传入具体的被装饰者对象。装饰者在实现自己的方法中调用被装饰者的方法,达到装饰的目的。
举个例子:
建造的类
package com.test.decorator;
/**
* 一个 建造的接口,拥有一个建造的方法,
* @author liuds1
* 这个接口是被装饰者的接口
*/
public interface Build {
void build();
}
造房子的类
package com.test.decorator;
/**
* 来造一个房子
* @author liuds1
* 实现Build接口的基础的功能
*/
public class BuildHouse implements Build {
@Override
public void build() {
System.out.println(" building house ......");
}
}
房子造完了,我们新的需求又来了,我们目前不仅仅想造房子,张三还想先粉刷房子再装修房子,李四想要先装修房子再粉刷房子。为了满足他们的奇葩需求,我们来构造一个抽象类(装饰者类),这个类维护了一个protected 修饰的 实现Build接口的对象。 并开放一个含有Build 类型参数的构造方法,通过构造方法初始化 build 对象。并用抽象方法实现Build接口。
package com.test.decorator;
/**
* 核心:
* @author liuds1
* 构造一个抽象的父类,所有的装饰者都继承该类。
*/
public abstract class AbstrBuildHouse implements Build {
protected Build build ;
public AbstrBuildHouse (Build build){
this.build = build;
}
//这里由具体的装饰者类来实现
@Override
public abstract void build() ;
}
粉刷房子的类
package com.test.decorator;
public class BuildPaintHouse extends AbstrBuildHouse {
public BuildPaintHouse(Build build) {
super(build);
}
@Override
public void build() {
paint();
//实现的时候需要调用基础的被装饰者类的方法,来完成被装饰者的功能
build.build();
}
private void paint(){
System.out.println(" paint houst ....");
}
}
装修房子的类
package com.test.decorator;
public class DecoratHosue extends AbstrBuildHouse {
public DecoratHosue(Build build) {
super(build);
}
@Override
public void build() {
decorator();
//实现的时候需要调用基础的被装饰者类的方法,来完成被装饰者的功能
build.build();
}
private void decorator(){
System.out.println(" decorator house....");
}
}
来实现 张三的需求:造房子,粉刷,装修。
package com.test.decorator;
public class Test {
public static void main(String[] args) {
//被装饰者对象
Build buildHouse = new BuildHouse();
//装饰者
Build buildPaintHouse = new BuildPaintHouse(buildHouse);
//装饰
Build decoratHouse = new DecoratHosue(buildPaintHouse);
decoratHouse.build();
}
}
另一种装饰
来实现 李四的需求:造房子,装修,粉刷。
package com.test.decorator;
public class Test {
public static void main(String[] args) {
Build buildHouse = new BuildHouse();
System.out.println("----------华丽分隔-------------");
Build decoratHouse = new DecoratHosue(buildHouse );
Build buildPaintHouse = new BuildPaintHouse(decoratHouse );
System.out.println("----------华丽分隔-------------");
buildPaintHouse .build();
}
}