关注微信公众号
动态地给一个对象添加一些额外的职责。就增加功能来说, D e c o r a t o r模式相比生成子类更为灵活。
以下情况使用D e c o r a t o r模式 • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 • 处理那些可以撤消的职责。 • 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。 另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
输出语句如下:
住在北京路那里的人的房租3000.0 住在北京路那里的人的房租1楼5000.0 住在北京路那里的人的房租2楼4000.0
public class Test { public static void main(String[] args) { Peopleo p= new Peopleo(); System.out.println(p.name()+p.price()); BeiJinLu1 A= new BeiJinLu1(p); System.out.println(A.name()+A.price()); BeijinLu2 B= new BeijinLu2(p); System.out.println(B.name()+B.price()); } //要添加的附加功能的接口,抽象被装饰者接口,地址这个接口,存放了地址跟房租的价格两个成员 public static interface Address { public String name(); public float price(); } //新建一个具体的装饰者类,因为接口不能被new,只能子类化,这个子类设置了两个基本参数.创建了People其实也就是跟接口绑定了同个内存地址 static class Peopleo implements Address{ @Override public String name() { return "住在北京路那里的人的房租" ; } @Override public float price() { return 3000f; }} //抽象的北京路,核心的类 //实现了Address并且具备了Address作为自己的成员,抽象类实现抽象接口,就要实现抽象的方法,而抽象方法的返回值,设置为接口的方法 static abstract class BeijinLu implements Address{ private Address a; public BeijinLu(Address a) { super (); this .a = a; } @Override public String name() { return a.name(); } @Override public float price() { return a.price(); } } //具体子类--北京路1楼 public static class BeiJinLu1 extends BeijinLu{ public BeiJinLu1(Address a) { super (a); } @Override public String name() { return super .name()+ "1楼" ; } @Override public float price() { return super .price()+2000f; } } //具体子类--北京路2楼 public static class BeijinLu2 extends BeijinLu{ public BeijinLu2(Address a) { super (a); } @Override public String name() { return super .name()+ "2楼" ; } @Override public float price() { return super .price()+1000f; } } }