跳至主要内容

设计模式 笔记

文章请参考:
http://caterpillar.onlyfun.net/Gossip/DesignPattern/index.html

-> 表示类的继承

1.factory
f -> concreateF
p->concreatP

f.createP

concreateF.createP(return new concreateP)

2.abstract factory:
af
af->cf1
af->cf2
apa->pa1
apa->pa2
apb->pb1
apb->pb2
cf1.createA(return new pa1)
cf1.createB(return new pb1)
cf2.createA(return new pa2)
cf2.createB(return new pb2)

3.singleton
A
A::instance(){ return this.instance or this.instance=new A}

使用:
a=A::instance()

4.builder
最简单的例子:
   1: //Client同时充当了Director的角色
   2: StringBuilder builder = new StringBuilder();
   3: builder.Append("happyhippy");
   4: builder.Append(".cnblogs");
   5: builder.Append(".com");
   6: //返回string对象:happyhippy.cnblogs.com
   7: builder.ToString(); 
builder模式主要是有个build part的过程,这个过程叫director,它build的参数,顺序不同都是不同的结果,而abstract factory没有这个过程
这句话解释的最好:
客户端调用:director负责发布命令,builder才负责真正的生产,所以向builder要产品而不是director
//调用   
public class Client {   
    public static void main(String[] args) {   
        Builder builder = new ConcreteBuilder();   
        Director director = new Director( builder );    
        director.construct(); //builder负责真正的生产   
      Product product = builder.getResult();  //向builder要产品而不是向director要产品 
 } 
是想builder要产品,更换不同的director, builder能够得到不同的产品
1、需要生成的产品对象有复杂的内部结构。
2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、当复杂对象的创建应该独立于该对象的组成部分和装配方式时

但是有个问题是这个builder就必须以传址的方式传递给director。

5. prototype
就是
P::clone
p1=p.clone();
复制本身。

结构型模式

1.bridge模式
对象分析和设计中其实基于两个原则:
a.一个类只有一个引起它变化的原因
b.使用组合而不是继承来实现功能需求

实现方式:
就是当类有两个以上的强烈变化的原因的时候,使用birdge而非继承,避免类的数量过于膨胀。
AbstractRoad
AbstractRoad->SpeedWay 
AbstractRoad->Street 
AbstractP 
AbstractP->Man
AbstractP->Woman
AbstractV
AbstractV::run()
AbstractV::road
AbstractV::P
AbstractV->Car
AbstractV->Bus
car.p=Man
car.road=SpeedWay
car.run()
or b
us.p=woman
bus.road=street
bus.run()
这是一个简单的例子
2. Adapter 模式
就我理解是把一个interface 转化为另外一个interface,一定是interface而不是类。

Adapter,表示遇到的问题是接口不匹配。
Proxy,表示遇到的问题是主体逻辑与附加逻辑(持久化、网络传输等)纠缠。
这两句话解释了很多问题。
3. Decorator 模式
interface Meal {getContent(), price()}
Meal->FriedChiken
Meal->FiredHamburger
Meal-> abstract SideDish
SideDish->DishOne
SideDish->DishTwo
Meal meal=DishOne(FriedChicken);
meal.getContent()
meal.price()
in dishone, the getContent call the getcontent of friedChicken and combine the result.
the same as price. by this way we can add functions or make modification without hieritage.

4. composite 模式:
interface P: play()
P->Frame
P->PList:list
add Frame in Plist:list
and call Frame.play() in Plist.play for each list element.

5. flyweight 模式:
把也许会重复生成的小object 放在一个静态hash表里(可以通过factory模式来实现这个hash表)。create一个小object时,先看这个hash表里有没有,没有就生成一个并在hash表里添加这个object的指针,如果有就不重新生成,直接从hash表里取出,前提是这个object并不会被其他的程序所更改。
6.facade模式
如果你的函数中需要调用很多库的类,那么你的函数就会与库有很高的耦合度,如果库有变化,那么你就需要改写每一处使用这些库的地方,facade模式就是抽象出一个service,让service提供一些函数来实现对库的操作或者是组合内容,这样你的函数中就只需要调用service的函数,好处是库变化是,你只需要更改你的service,而不用更改你每一处用到库的地方。不好是你又加了一层复杂度,有时候会变得更加难以理解。
7. proxy模式
比如这个:
Proxy
在原始逻辑上添加一层而已。

行为模式

1.Template模式
将父类作为骨架,将实作的实现放到子类来填充,
2. Chaine of responsiblity 模式
具体用例请参见文章开始的引文,我的理解是这样的:
如果你有一个procedure,比如这种:

if a then
  do a 
else if b then 
  do b
else if 
....

endif
这种情况下,如果你的处理流程改了,需要增加或者更改顺序,(比如a ,b ...上有语义上的包含关系,更改顺序会使得结果截然不同),那么你都需要重新更改这段程序,而且如果这种关系比较复杂,那么更改的时候会比较痛苦。
这是後通过构造一个统一的基础虚类,然后把不同的操作实作为衍生类,然后通过他们之间的调用顺序来实现不同的执行顺序,避免了大量的if then,语义上看起来也比较清晰
h=new a(new b(new c()));
h.handle()
就解决了,而且也把不同的处理流程完全分开了,使得程序的耦合性降低。

3. command 模式

这个模式很常见,我自己都常常在用,比如说在spoop中的那个controller class, command 传入以后, 调用CommandAction,将receiver放在传回的值当中或者用JsonResponse中,


这个uml图就很好解释了这个关系,receiver不一定要封装在command中,也可以注入

4. strategy 模式

这个模式的核心思想和template很像

strategy就是:
      Server server = new Server(9999, new EchoService());
        server.start();
template是:
     GuessGame game = new ConsoleGame();
     game.go();

strategy 是传入不同的组件来实现不同的服务,template是用不同的子类来实现通过父类定义好的模板。

5. observer 模式

这个就是消息分发机制的抽象,当subject 管理一个obeserver列表,当subject的状态改变时,通知列表里的obersever,obersever此时执行update().

Mediator 模式


这个图说的很明白,就好比需要一个中间人来处理一群共事的同时之间的关系,使得团队各个成员的工作彼此独立,交互更有弹性。(比如更换成员,比如更改联系方式)

visitor 模式

将工作流程与操作物件的类型的特定结构分离,将特定结构放在vistor中,这样方便随时修改也改善了耦合关系。

评论

此博客中的热门博文

对于GFW的看法

谈到这个问题的人很多,讲的也非常详细,但我窃以为大多数人对此都不够重视。在这一点上来讲,国民党堪称楷模,我想台湾能有今日,很大程度上是因为他们最终也没有建立一个可以堪比中国的新闻审查制度。从权利集中的角度来讲,中国共产党并不比任何一个封建王朝差,从执行力度上来讲,那也和历史上最严酷的王朝可以评分秋色。至少,国民党还是讲点道德,尊重文化的。 如果说计划生育阉割了中国人的人口,那么GFW,和新闻出版署以及文化部阉割了中国人的精神。也许乐观的人说我们总可以翻墙,我们总可以通过这样那样的方法来获得信息。但是悲观的我并不这么认为,这种限制创造的是一种环境,是空气,你固然可以戴着口罩,但是你永远无法自由的呼吸,当大家都在这样的空气中活着的时候,戴着口罩的你是会被人另眼相看的。其实群体意识在掌握了所有媒体的政府面前就是一个面团,想怎么捏就怎么捏,本来就是信息不对称的更何况还是受到随意控制的。这是无解的,中国亟待提高公民意识,哲学思想,文化水平,等等,政府做的不过是又一轮的愚民罢了。鲁迅先生为之殚精极虑,奋斗一生的东西,过了一个世纪依然没有什么本质的改变,阿Q在国人里占的比例是在太大了。就好比是我以诚待国人,以心侍之,以身献之,奈何国人谓之以“傻逼”。你却又待何如?这样的文化封锁,信息封锁导致的唯一结果就是,你振臂一呼之时,便是阿Q们结队去看你被看头之日。 其实,中国政府早已脱离了共产主义这个哲学思想了。换句话说,这个哲学思想本身是没什么对错的,只是一旦应用起来就满不是那么回事了,几乎可以说,共产主义的集权必然导致共产主义的被抛弃。

My childhood

"Each person's life is like a book; some people prefer to savor it slowly, while others like to gradually forget it. Looking back, I want to see if I can discern the trajectory of the world from my seemingly insignificant life. I am a child from the countryside, and perhaps most people cannot understand what my so-called countryside looks like. Indeed, the impressions of the countryside can be very different depending on the country, and moreover, more than 40 years have passed, during these 40 years of rapid development in China. A phrase suddenly comes to mind, 'I see him building tall buildings, I see him feasting, I see everything collapsing.' The place where I was born is a small town in the southwest of China, a town so small that it only has one street, and the widest part is only 3 meters. Paved with stone slabs, worn by many years of use, the slabs are not flat but rather filled with small bumps and hollows, yet strangely smooth. At the end of the street is a ...

记得很久以前,不知道是在跟谁发感慨,久到好像是上大学时候的事了。我说,我流过很多眼泪,看电影流眼泪,看小说流眼泪,听别人的故事留言了,听歌的时候流眼泪,晚上一个人的时候独自流眼泪。我似乎是一个是一个太不像男人的男人。可是我又说,这些眼泪都是为自己流的。于是我也问对面那个人,(嗯,我也记不起她是谁了): "你为别人流过眼泪么?",居然没有回答我. 也许看见这篇文章的人也不相信,但是我真的想问你一句,你为别人流过眼泪么?真真正正的是为别人的,不是可怜自己,不是觉得别人可怜而让自己也感到了可怜,仅仅是为了别人而悲伤,有过么?如果真的有,我想那也许才是爱吧。 也许您会觉得奇怪,这和爱有什么关系?是啊,流眼泪就是爱么?我们因为悲伤而流泪,流泪是因为,爱别离,求不得,这些的主体是什么?是自己。 我们都是爱自己的,只是99%的人是吧。所以我们流泪了,因为我们的那些种种原因,我们很少会因为别人“求不得,爱别离”而流泪吧。也许说,那又不是自己,对呀,你爱自己,你又不爱她,何苦要为她流这种泪? 我不是一个宽容的人,我也不是一个豁达的人,这是我一生的缺点。我们会为了爱去宽容,我们会因为爱而变的豁达,也许,这是因为我从来都没有真正的爱过谁吧,甚至,连自己。嘿,我现在都开始疑惑,我真的爱过你么,如果是,我为什么都没有宽容和豁达呢?