Android装饰者模式学习笔记(1)

来源:互联网 发布:粉晶手串淘宝 编辑:程序博客网 时间:2024/05/29 12:41

Android装饰者模式学习笔记(1)

1我们要解决的问题,假设已有A类可以输出字母A,现在要扩展成可以输出AXXX,X可以用BCD任何一个来表示,例如ABCD,ABDC,ADCB…等等,怎么用装饰者模式来扩展?

2假设这就是已经存在的A类,我们把A类当成是被装饰者

public class A{    public String outPut(){        return "A";    }}

3我们开始动手写代码,创建装饰接口

public interface I {    String outPut();//这里的方法名跟A类的要扩展的方法名一样,我个人理解    //的好处就是一会儿A类要实现接口的时候,代码不用做任何改变    //如果不一样,那A类就得实现接口方法,就不符合装饰者模式的定义了}

4让A类实现接口

public class A implements I {//只是多加了一个实现,不必修改其他地方    public String outPut(){        return "A";    }}

5创建装饰者父类

public class Decorate implements I {    I i;    public Decorate(I i) {//构造函数里要传一个I类型的参数,这里很重要,如果看完全部代码再回来看    //就会发现被装饰者和装饰者全部都实现了I接口,所以被装饰者和装饰者都可以作为参数传进来    //但是还有个重点,后面解释...        this.i = i;    }    @Override    public String outPut() {        return i.outPut();    }}

6创建装饰者类

public class B extends Decorate {//这里通过继承Decorate类,而Decorate类实现I接口来间接完成B实现I接口    public B(I i) {//因为父类构造函数带参,所以这里也得写        super(i);    }    @Override    public String outPut() {//这个如果不重写,会有什么影响,代码的执行情况是什么样的,后续研究        return i.outPut() + "B";    }}
public class C extends Decorate {    public C(I i) {        super(i);    }    @Override    public String outPut() {        return i.outPut() + "C";    }}
public class D extends Decorate {    public D(I i) {        super(i);    }    @Override    public String outPut() {        return i.outPut() + "D";    }}

7一切准备就绪,我们先输出ABCD

public class Test {    public static void main(String[] args) {        Decorate decorate = new D(new C(new B(new A())));        //接着第5条的往下说,new的时候,装饰者都需要一个I类型的参数来实现构造函数,        //但是,但是,但是,被装饰者A类是无参的构造函数        //所以,所以,所以,不管怎么new,new到最后要以被装饰者A类收尾。        System.out.println(decorate.outPut());        //再来看看为什么这么一连串的new就可以输出ABCD呢        //1 我们实际上是new 了一个D类型的变量出来,所以我们执行的是d类的outPut方法        //2我们去方法里看,实际上执行的是参数I的outPut + "D"        //3那么d里的参数I是什么呢,其实就是C类,对吧,所以就是C类的outPut方法        //4C类的output方法同理 就是他的参数I的output + "C"        //5同理 就是 B的 output + "B"        //6同理 就是 A的 "A"        //7好了,到此为止,因为A的output 只是输出了A,没有后续了     }}

8让我们看一下运行结果

ABCD

9总结:装饰者模式,就是原本的功能需要扩充的时候,把新的方法写在新的类里,通过实现相同接口的方式来让原先的类和新的类 达到类型统一的目的,然后在新的功能类里 执行其他同类型的类的方法 加上自己的改动,来达到扩展的效果,这种概念性的总结看起来很别扭,但主要是领会精神,看懂代码就可以。

10优点:假设A类是个很复杂的类,经过大家不断的努力现在已经改成了没有任何Bug的精品代码,那么我们再去改A类就有可能破坏掉这份经典的代码,如果我们用装饰者模式,就可以避免破坏A代码的同时,完成我们想要的扩展,这就是优点。

11疑问
(1)我们这么做只能实现AXXX模式,假如我想实现XXXX模式怎么做,例如DCBA?A类一定要作为最后收尾的类吗,如果不是,该怎么改?
(2)A类是不是被装饰者,如果不是,到底谁是被装饰者?
(3)装饰者类BCD,如果不重写output方法,代码也不会报错,因为他们的父类已经重写过了,那执行结果会是什么呢,为什么呢?
(4)可不可以不创建装饰者父类,仅依靠BCD实现I接口能不能完成扩展呢?

其实这篇博客里有一些错误的概念,但作为入门的第一篇,其实逻辑还是通顺的,下一篇博客继续研究正确的装饰者模式…

原创粉丝点击