博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式总结
阅读量:6113 次
发布时间:2019-06-21

本文共 3286 字,大约阅读时间需要 10 分钟。

1、简单工厂模式——代码摘自《大话设计模式》

将业务与客户端代码分离

 业务Operation操作类

154521_Uh9H_661133.png

业务加减乘除类

154521_jZIi_661133.png

154521_BfHj_661133.png

业务简单运算工厂类

154521_GlYk_661133.png

154521_JyWM_661133.png

客户端代码

154522_Z2fn_661133.png

业务UML图

154522_EpTc_661133.png

2、代理模式——代码摘自《大话设计模式》

场景如下:追求者,被追求者,代理3个人,追求者要追求被追求者,委托代理送花等进行一系列追求的动作。

代理与被代理者结构图

114635_qDk5_661133.png

共同实现的接口

114704_K5G4_661133.png

追求者

114948_LMw8_661133.jpg

代理类

115142_IxKC_661133.png

115142_DzjW_661133.png

客户端代码

115206_hCxa_661133.png

UML图

115221_vjkZ_661133.png

应用

    Android中的客户端访问系统服务,和facebook提供的thriftdou是典型的代理模式,用于远程调用。

3、观察者模式(也叫发布订阅模式)

    以Android为例,典型的观察者模式的应用是DataSetObservable和DataSetObserver这两个类。DataSetObservable表示被观察者,DataSetObserver表示观察者。

    DataSetObservable继承自抽象类Observable,先从Observable说起。

    Observable是一个带泛型的抽象类。表示一个观察者对象,提供了观察者注册、注销及清空三个方法。其源码如下:

public abstract class Observable
 {    protected final ArrayList
 mObservers = new ArrayList
();    public void registerObserver(T observer) {        if (observer == null) {            throw new IllegalArgumentException("The observer is null.");        }        synchronized(mObservers) {            if (mObservers.contains(observer)) {                throw new IllegalStateException("Observer " + observer + " is already registered.");            }            mObservers.add(observer);        }    }    public void unregisterObserver(T observer) {        if (observer == null) {            throw new IllegalArgumentException("The observer is null.");        }        synchronized(mObservers) {            int index = mObservers.indexOf(observer);            if (index == -1) {                throw new IllegalStateException("Observer " + observer + " was not registered.");            }            mObservers.remove(index);        }    }    public void unregisterAll() {        synchronized(mObservers) {            mObservers.clear();        }    }}

    Observable的直接继承者有两个:DataSetObservable和ContentObservable。ContentObservable实现比较复杂,不过功能与DataSetObservable类似,这里只讲解DataSetObservable。

    DataSetObservable在很多的Adapter中都用到,像BaseAdapter。

    DataSetObserver表示了一个数据集对象的观察者,主要提供了两个方法:

public abstract class DataSetObserver {    public void onChanged() {        // Do nothing    }    public void onInvalidated() {        // Do nothing    }}

    DataSetObservable实现如下:

public class DataSetObservable extends Observable
 {    public void notifyChanged() {        synchronized(mObservers) {            // since onChanged() is implemented by the app, it could do anything, including            // removing itself from {@link mObservers} - and that could cause problems if            // an iterator is used on the ArrayList {@link mObservers}.            // to avoid such problems, just march thru the list in the reverse order.            for (int i = mObservers.size() - 1; i >= 0; i--) {                mObservers.get(i).onChanged();            }        }    }    public void notifyInvalidated() {        synchronized (mObservers) {            for (int i = mObservers.size() - 1; i >= 0; i--) {                mObservers.get(i).onInvalidated();            }        }    }}

    当数据集有变化时,会调用DataSetObserver的onChanged()方法;当数据集失效时,会调用DataSetObserver的onInvalidated()方法。

4、模板方法模式

    模板方法模式是用来提炼代码的。在提炼代码的过程中会用到abstract方法。

    举个《大话设计模式》中的例子。学生抄写试卷,并回答问题。代码冗余的做法:

    学生甲的试卷:

142846_YqPy_661133.jpg

142847_aHHj_661133.png

   学生乙的试卷:

142941_rahG_661133.jpg

   客户端代码:

143016_rHrn_661133.png

143017_dK2h_661133.png

   从上可以看出,代码非常冗余,将代码进行提炼,得到如下代码:

   抽象出的父类代码:

143401_IQ08_661133.jpg

    学生子类代码:

143420_veqj_661133.jpg

    客户端代码和上面的相同。

   以上的代码还可以再提炼。

143626_yX7p_661133.png

143645_M6If_661133.png

143646_8Fmd_661133.png

    客户端代码为:

143704_L0yW_661133.png

    模板方法抽象代码:

143942_4CXi_661133.png

144039_75vM_661133.jpg

144039_4KVB_661133.png

   UML图如下:

144105_aIKz_661133.png

    模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。

    模板方法模式就是提供了一个很好的代码复用平台。

    当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。

转载于:https://my.oschina.net/tingzi/blog/222695

你可能感兴趣的文章
JQuery-EasyUI Datagrid数据行鼠标悬停/离开事件(onMouseOver/onMouseOut)
查看>>
并发和并行的区别
查看>>
软件测试之作业二
查看>>
Java字符串中常见的10个问题
查看>>
html table 知识点
查看>>
struct和union分析实例
查看>>
xml文件的建立和编码[SimpleXMLElement]
查看>>
在Unity3d中调用外部程序及批处理文件
查看>>
设计模式值六大原则——迪米特法则(LoD)也称为最少知识原则(LKP)。
查看>>
HDU 1242 Rescue(BFS + 优先队列)
查看>>
UVa 572 Oil Deposits(简单DFS)
查看>>
往每一个数组前面追加一个前缀
查看>>
Golang游戏服务器与skynet的个人直观比较
查看>>
Bootstrap关于表单(二):水平表单
查看>>
CAP定理
查看>>
Permutations
查看>>
Android布局技巧——合并布局
查看>>
基于python的性能测试工具–locust
查看>>
Windows服务监视,如果停止则启动
查看>>
maven 一个phase绑定多个插件
查看>>