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接口能不能完成扩展呢?
其实这篇博客里有一些错误的概念,但作为入门的第一篇,其实逻辑还是通顺的,下一篇博客继续研究正确的装饰者模式…
阅读全文
0 0
- Android装饰者模式学习笔记(1)
- Android装饰者模式学习笔记(2)
- 装饰者模式学习笔记
- 【学习笔记】装饰者模式
- 装饰模式(学习笔记)
- java/android 设计模式学习笔记(7)---装饰者模式
- 设计模式学习笔记十(Decorator装饰者模式)
- 【设计模式】学习笔记3:装饰者模式(Decorator )
- 设计模式---装饰者模式(学习笔记)
- 设计模式学习笔记(三)- -装饰者模式
- 设计模式-装饰者模式学习笔记
- 装饰模式--学习笔记
- 装饰模式学习笔记
- 装饰模式学习笔记
- 学习笔记之装饰者模式
- 装饰(包装)设计模式学习笔记
- Android开发笔记(九十三)装饰模式
- 装饰者模式笔记
- 连续自描述数据的找出相同类型的起止编号
- C# 核心语法-反射
- Shiro (一)
- python None 与 Nan的理解
- H5实训课笔记(一)
- Android装饰者模式学习笔记(1)
- 线上应用故障排查之一:高CPU占用
- Tcp的拥塞控制
- 一抹华为红
- Android Webview 和Javascript交互调用
- 1682亿!!阿里工程师如何喝着茶创造双11奇迹?
- no1 计算机视觉历史 & k近邻线性分类器 & 损失函数和最优化
- 毕业5年决定人的一生(大家有空一定要看看)
- 静态数据与非静态数据的区别