Java设计模式:装饰者模式

    xiaoxiao2021-03-25  124

    泰达港数码店出品,侵权必究 关注微信公众号 xyxcode ,学海无涯,与你相伴

    DECORATOR(装饰)

                         关注微信公众号

                        动态地给一个对象添加一些额外的职责。就增加功能来说, 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;      }            }     }

     

     

     

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-3334.html

    最新回复(0)