设计模式笔记



关联、依赖、组合、聚合、实现、泛化


依赖:局部变量、方法的参数、静态方法的调用;


关联/聚合:成员变量


*********************************************************************


创建模式

简单工厂模式、工厂方法、抽象工厂模式、原型模式、建造者模式、单例模式;


结构模式

门面模式、代理模式、装饰者模式、适配器模式、组合模式、享元模式、桥接模式;


行为模式

模板模式、观察者模式、策略模式、备忘录模式、职责链模式、命令模式、状态模式、中介者模式、解释器模式、访问者模式;


*********************************************************************


命令模式


命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,

对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能;

命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开委派不同的对象;


请求者发送命令给接收者,接收者执行业务逻辑;所以,业务逻辑是在接收者的行为中定义的;

同过命令角色,实现了请求者与接收者的解耦;


命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,

以及操作是否被执行、何时被执行,以及是怎么被执行的。


命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:

1、命令模式使新的命令很容易地被加入到系统里;

2、允许接收请求的一方决定是否要否决请求;

3、能较容易地设计一个命令队列;

4、可以容易地实现对请求的undo、redo;

5、在需要的情况下,可以较容易地将命令计入日志;


例子:

client、invoker、receiver、command/concreteCommand


Receiver receiver = new Receiver();

Command command = new ConcreteCommand(receiver);

Invoker invoker = new Invoker(command);

invoker.action();

client:玉皇大帝、invoker:太白金星、receiver:孙悟空、command:圣旨;


*********************************************************************


0、门面模式


外部与一个复杂子系统的通信必须通过一个统一的门面对象进行,这就是门面模式;

门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面对象进行;


随着业务的发展,设计师往往仍然会发现一个子系统内仍然有太多的类要处理,而是要那个一个子系统的客户端往往只关注一些特定的功能,

需要同时与子系统内部的许多对象打交道后才能达到目的,通过门面模式,可以简化;


优点:

1、为一个复杂子系统提供一个简单的接口;

2、通过门面可以解耦客户端与实现化层;

3、在构建一个层次化的系统时,可以使用门面模式定义系统中每一层的入口,从而简化了层与层之间的依赖关系;


*********************************************************************


1、中介者模式(java与模式)


角色:Meditor、ConcreteMeditor、Colleague、ColleagueA、ColleagueB;

抽象调停者、具体调停者、抽象同事类、具体同事类;

Meditor(+colleagueChanged:void);

ConcreteMeditor(ColleagueA、ColleagueB、+createConcreteMeditor、+colleagueChanged:void);

Colleague(Meditor、+change:void、+action:void);

ColleagueA(+action:void);

ColleagueB(+action:void);

关键字:网状、星形、独立变化;


中介者模式将一个网状的系统结构变成一个以中介者为中心的星形结构。

中介者模式包装了一系列对象相互作用的方式,使得这些对象不必互相明显引用。从而使它们可以较松散地耦合。

当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保

证这些相互作用可以彼此独立地变化。


中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护和扩展,

将原本难以理解的网状结构转换成相对简单的星型结构。


中介者模式可将各同事对象解耦。中介者有利于各同事之间的松耦合,我们可以独立的改变和复用每一个同事和中介者,

增加新的中介者和新的同事类都比较方便,更好地符合“开闭原则”。


可以减少子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,

这使各个同事类可被重用,无须对同事类进行扩展。


优点:简化了对象间的交互、各同事对象间解耦、减少子类生成(扩展新的中介者子类即可);


缺点:中介者类会很复杂,难以维护;


例子:


*********************************************************************


2、表达式模式(java与模式)


角色:client、Context、Expression、TerminalExpression、NonTermianlExpression;

客户端、上下文、抽象表达式、终结表达式、非终结表达式;

AbstractExpression(+interpret(Map));

VarExpression(String、+interpret(Map));

AddExpression(Expression、Expression、+interpret(Map));

Context(Map、String[]、stack);

关键字:语法扩展;


解释器是一个简单的语法解释器,最显著的优点是扩展性,扩展语法,只要增加非终结符类就可以了;

缺点有非终结类膨胀,递归循环影响性能;

尽量不要在重要的模块中使用解释器模式,否则维护会是一个很大的问题。

在项目中可以使用shell、JRuby、Groovy等脚本语言来代替解释器模式,弥补Java编译型语言的不足。


优点:

0、语法易于扩展;


缺点:

0、复杂文法难以维护;

1、递归操作,性能差;

例子:client、HashMap、Expression、VarExpression、AddExpression;

加减表达式的实现;


*********************************************************************


3、访问者模式

http://blog.csdn.net/lovelion/article/details/7433591


角色:Visitor、VisitorA、VisitorB、Node、NodeA、NodeB、ObjectStrcture、client;

Visitor(+visite(NodeA)、+visite(NodeB))、Node(+accept(Visitor));

当系统中存在一个较为复杂的对象结构,且不同访问者对其所采取的操作也不相同时,可以考虑使用访问者模式进行设计。


关键字:结构稳定、复杂、不同状态/分类操作、结构和操作解耦、双重分派;


优点:

0、把数据结构和作用于结构上的操作之间的耦合解脱开;

1、增加新的访问操作很方便,直接增加新的访问者即可;

2、将有关元素对象的访问行为集中到一个访问者对象中,而不是分散在一个个的元素类中。类的职责更加清晰,有利于对象结果中元素对象

的复用,相同的对象结构可以供多个不同的访问者访问;

3、让用户能够在不修改现有元素类层次结构的情况下,定义作用于该层次结构的操作;

4、双重分派访问递归,树形结构递归;

缺点:

1、增加新的元素类很困难;意味着在抽象访问者角色中增加一个新的抽象操作;

2、破坏封装。访问者模式要求访问者对象访问并调用每一个元素对象的操作,这意味着元素对象有时候必须暴漏一些自己的内部操作和内部状态,

否则无法提供访问者访问;

使用场景:

1、一个对象结构包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作。在访问者中针对每一种具体的类型都提供了一个访问操作,

不同类型的对象可以有不同的访问操作;

2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这

些类。访问者模式使得我们可以将相关的访问操作集中起来定义在访问者类中,对象结构可以被多个不同的访问者类所使用,将对象本身与对象的

访问操作分离;

3、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作;


例子:男人、女人、成功、失败、恋爱、结婚时的反映;

老师、学生、论文数量、考试成绩等绩效的反映;


*********************************************************************


4、状态模式


角色:context、state、stateA、stateB;

context(state、+request)、state(+handle(context));

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类;

主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化;


关键字:状态、转换、分支;


优点:将所有与某个状态有关的行为放到一个类中,而不是提供一个巨大的条件语句;


缺点:新增状态要修改状态转换的代码;


例子: Sunny软件公司欲开发一款纸牌游戏软件,在该游戏软件中用户角色具有入门级(Primary)、熟练级(Secondary)、

高手级(Professional)和骨灰级(Final)四种等级,角色的等级与其积分相对应,游戏胜利将增加积分,失败则扣除积分。

入门级具有最基本的游戏功能play() ,熟练级增加了游戏胜利积分加倍功能doubleScore(),高手级在熟练级基础上再增加换牌功能changeCards(),

骨灰级在高手级基础上再增加偷看他人的牌功能peekCards()。

试使用状态模式来设计该系统。

银行帐户管理

*********************************************************************


5、备忘录模式

角色:备忘录(Memento)、发起人(Originator)、负责人(Caretaker)

Memento(state、+get/set)、Originator(state、+createMemento()、+resotoreMemento(Memento))、Caretaker(Memento、+get/set);

备忘录模式意在不破坏封装的情况下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

*********************************************************************


6、命令模式

角色:客户端(Client)、命令(Command)、具体命令(ConcreteCommand)、请求者(Invoker)、接收者(Receiver);

行为:请求者:action、命令:execute、接收者:action;

Commond(Receiver、+execute())、Receiver(+action())、Invoker(Commond、+action());

命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象;

命令模式通过命令对象把请求的一方和接收命令的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,

更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

优点:

1)、新的命令很容易被加入到系统里;

2)、允许接收请求的一方决定是否要否决请求;

3)、能较容易地设计一个命令队列;

4)、可以容易地实现对请求的Undo和Redo;

5)、在需要的情况下,可以较容易地将命令记入日志;


*********************************************************************


7、责任链模式


角色:抽象处理者(Handler)、具体处理者(ConcreteHandler)

行为:handleRequest;

Handler(successer、+handleRequest);

*********************************************************************


8、迭代子模式


角色:Iterator(抽象迭代子)、ConcreteIterator(迭代子)、聚集角色(Aggregate)、具体聚集角色(ConcreteAggregate);

Iterator(ConcreteIterator、+next())、Aggregate(+iterator());

*********************************************************************


9、观察者模式


角色:Subject(抽象主题)、ConcreteSubject(具体主题)、Observer(抽象观察者)、ConcreteObserver(具体观察者);

Subject(Vector<Observer>、+notify()、+add(Observer)、+remove(Observer)); Observer(+update());

观察者模式可以实现表示层和数据逻辑层的分离;

*********************************************************************


10、模板模式

行为:hookMethod、concreteMethod、abstractMethod

方法的实现延迟到子类

*********************************************************************


11、策略模式

针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以互相替换。策略模式使得算法可以在不影响到客户端的情况下发生变化;

角色:Context、Strategy、ConcreteStrategy;

行为:contextInterface、strategyInterface;

Context(strategy、+operate())、Strategy(+operate());

*********************************************************************


12、桥接模式

将抽象化与实现化脱藕,使得二者可以独立地变化;

角色:抽象化角色(Abstraction)、修正抽象化角色(Refined Abstraction)、实现化角色(Implementor)、具体实现化角色(Concrete Implementor);

Abstraction(Implementor、+operation())、Implementor(+operationImpl());

*********************************************************************


13、享元模式

共享池

*********************************************************************


14、代理模式


角色:subject、ProxySubject、RealSubject;

subject(+request())、ProxySubject(RealSubject、request()、+preRequest()、+postRequest())、RealSubject(+request());

反射、动态代理;


*********************************************************************


15、装饰模式

装饰者模式使用原来被装饰的类的一个子类的实现,把客户端的调用委派给被装饰类。

装饰模式的关键在于这种扩展是完全透明的。

角色:Component(抽象构件)、ConcreteComponent(具体构件)、Decorator(装饰者模式)、ConcreteDecorator(具体装饰者模式);

Component(+sampleOperation())、Decorator(Component、+sampleOperation());


*********************************************************************


16、合成模式

角色:Component(抽象节点)、Composite(子节点)、Leaf(叶子节点)

Component(Composite、+sampleOperation())、Composite(Vector<Component>、+sampleOperation()、+add/remove())、Leaf(+sampleOperation());


*********************************************************************


17、适配器模式

角色:Target(目标接口)、Adaptee(源角色)、Adapter(适配器);

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

*********************************************************************


18、原型模式

克隆

*********************************************************************


19、建造者模式

角色:Builder(抽象建造者)、ConcreteBuilder(具体建造者)、Director(导演者)、Product(产品)

Builder(+buildPart1()、+buildPart2()、+retrieveResult:product)、Director(Builder、+construct());

将一个产品的内部表象和产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象;

*********************************************************************

20、单例模式

私有化构造方法;

同步;


*********************************************************************


21、抽象工厂模式、工厂方法模式、简单工厂模式;


*********************************************************************


关联、依赖、组合、聚合、实现、泛化


依赖:局部变量、方法的参数、静态方法的调用;


关联/聚合:成员变量


*********************************************************************


创建模式

简单工厂模式、工厂方法、抽象工厂模式、原型模式、建造者模式、单例模式;


结构模式

门面模式、代理模式、装饰者模式、适配器模式、组合模式、享元模式、桥接模式;


行为模式

模板模式、观察者模式、策略模式、备忘录模式、职责链模式、命令模式、状态模式、中介者模式、解释器模式、访问者模式;


*********************************************************************


命令模式


命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,

对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能;

命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开委派不同的对象;


请求者发送命令给接收者,接收者执行业务逻辑;所以,业务逻辑是在接收者的行为中定义的;

同过命令角色,实现了请求者与接收者的解耦;


命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,

以及操作是否被执行、何时被执行,以及是怎么被执行的。


命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:

1、命令模式使新的命令很容易地被加入到系统里;

2、允许接收请求的一方决定是否要否决请求;

3、能较容易地设计一个命令队列;

4、可以容易地实现对请求的undo、redo;

5、在需要的情况下,可以较容易地将命令计入日志;


例子:

client、invoker、receiver、command/concreteCommand


Receiver receiver = new Receiver();

Command command = new ConcreteCommand(receiver);

Invoker invoker = new Invoker(command);

invoker.action();

client:玉皇大帝、invoker:太白金星、receiver:孙悟空、command:圣旨;


*********************************************************************


0、门面模式


外部与一个复杂子系统的通信必须通过一个统一的门面对象进行,这就是门面模式;

门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面对象进行;


随着业务的发展,设计师往往仍然会发现一个子系统内仍然有太多的类要处理,而是要那个一个子系统的客户端往往只关注一些特定的功能,

需要同时与子系统内部的许多对象打交道后才能达到目的,通过门面模式,可以简化;


优点:

1、为一个复杂子系统提供一个简单的接口;

2、通过门面可以解耦客户端与实现化层;

3、在构建一个层次化的系统时,可以使用门面模式定义系统中每一层的入口,从而简化了层与层之间的依赖关系;


*********************************************************************


1、中介者模式(java与模式)


角色:Meditor、ConcreteMeditor、Colleague、ColleagueA、ColleagueB;

抽象调停者、具体调停者、抽象同事类、具体同事类;

Meditor(+colleagueChanged:void);

ConcreteMeditor(ColleagueA、ColleagueB、+createConcreteMeditor、+colleagueChanged:void);

Colleague(Meditor、+change:void、+action:void);

ColleagueA(+action:void);

ColleagueB(+action:void);

关键字:网状、星形、独立变化;


中介者模式将一个网状的系统结构变成一个以中介者为中心的星形结构。

中介者模式包装了一系列对象相互作用的方式,使得这些对象不必互相明显引用。从而使它们可以较松散地耦合。

当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保

证这些相互作用可以彼此独立地变化。


中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护和扩展,

将原本难以理解的网状结构转换成相对简单的星型结构。


中介者模式可将各同事对象解耦。中介者有利于各同事之间的松耦合,我们可以独立的改变和复用每一个同事和中介者,

增加新的中介者和新的同事类都比较方便,更好地符合“开闭原则”。


可以减少子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,

这使各个同事类可被重用,无须对同事类进行扩展。


优点:简化了对象间的交互、各同事对象间解耦、减少子类生成(扩展新的中介者子类即可);


缺点:中介者类会很复杂,难以维护;


例子:


*********************************************************************


2、表达式模式(java与模式)


角色:client、Context、Expression、TerminalExpression、NonTermianlExpression;

客户端、上下文、抽象表达式、终结表达式、非终结表达式;

AbstractExpression(+interpret(Map));

VarExpression(String、+interpret(Map));

AddExpression(Expression、Expression、+interpret(Map));

Context(Map、String[]、stack);

关键字:语法扩展;


解释器是一个简单的语法解释器,最显著的优点是扩展性,扩展语法,只要增加非终结符类就可以了;

缺点有非终结类膨胀,递归循环影响性能;

尽量不要在重要的模块中使用解释器模式,否则维护会是一个很大的问题。

在项目中可以使用shell、JRuby、Groovy等脚本语言来代替解释器模式,弥补Java编译型语言的不足。


优点:

0、语法易于扩展;


缺点:

0、复杂文法难以维护;

1、递归操作,性能差;

例子:client、HashMap、Expression、VarExpression、AddExpression;

加减表达式的实现;


*********************************************************************


3、访问者模式

http://blog.csdn.net/lovelion/article/details/7433591


角色:Visitor、VisitorA、VisitorB、Node、NodeA、NodeB、ObjectStrcture、client;

Visitor(+visite(NodeA)、+visite(NodeB))、Node(+accept(Visitor));

当系统中存在一个较为复杂的对象结构,且不同访问者对其所采取的操作也不相同时,可以考虑使用访问者模式进行设计。


关键字:结构稳定、复杂、不同状态/分类操作、结构和操作解耦、双重分派;


优点:

0、把数据结构和作用于结构上的操作之间的耦合解脱开;

1、增加新的访问操作很方便,直接增加新的访问者即可;

2、将有关元素对象的访问行为集中到一个访问者对象中,而不是分散在一个个的元素类中。类的职责更加清晰,有利于对象结果中元素对象

的复用,相同的对象结构可以供多个不同的访问者访问;

3、让用户能够在不修改现有元素类层次结构的情况下,定义作用于该层次结构的操作;

4、双重分派访问递归,树形结构递归;

缺点:

1、增加新的元素类很困难;意味着在抽象访问者角色中增加一个新的抽象操作;

2、破坏封装。访问者模式要求访问者对象访问并调用每一个元素对象的操作,这意味着元素对象有时候必须暴漏一些自己的内部操作和内部状态,

否则无法提供访问者访问;

使用场景:

1、一个对象结构包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作。在访问者中针对每一种具体的类型都提供了一个访问操作,

不同类型的对象可以有不同的访问操作;

2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这

些类。访问者模式使得我们可以将相关的访问操作集中起来定义在访问者类中,对象结构可以被多个不同的访问者类所使用,将对象本身与对象的

访问操作分离;

3、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作;


例子:男人、女人、成功、失败、恋爱、结婚时的反映;

老师、学生、论文数量、考试成绩等绩效的反映;


*********************************************************************


4、状态模式


角色:context、state、stateA、stateB;

context(state、+request)、state(+handle(context));

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类;

主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化;


关键字:状态、转换、分支;


优点:将所有与某个状态有关的行为放到一个类中,而不是提供一个巨大的条件语句;


缺点:新增状态要修改状态转换的代码;


例子: Sunny软件公司欲开发一款纸牌游戏软件,在该游戏软件中用户角色具有入门级(Primary)、熟练级(Secondary)、

高手级(Professional)和骨灰级(Final)四种等级,角色的等级与其积分相对应,游戏胜利将增加积分,失败则扣除积分。

入门级具有最基本的游戏功能play() ,熟练级增加了游戏胜利积分加倍功能doubleScore(),高手级在熟练级基础上再增加换牌功能changeCards(),

骨灰级在高手级基础上再增加偷看他人的牌功能peekCards()。

试使用状态模式来设计该系统。

银行帐户管理

*********************************************************************


5、备忘录模式

角色:备忘录(Memento)、发起人(Originator)、负责人(Caretaker)

Memento(state、+get/set)、Originator(state、+createMemento()、+resotoreMemento(Memento))、Caretaker(Memento、+get/set);

备忘录模式意在不破坏封装的情况下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

*********************************************************************


6、命令模式

角色:客户端(Client)、命令(Command)、具体命令(ConcreteCommand)、请求者(Invoker)、接收者(Receiver);

行为:请求者:action、命令:execute、接收者:action;

Commond(Receiver、+execute())、Receiver(+action())、Invoker(Commond、+action());

命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象;

命令模式通过命令对象把请求的一方和接收命令的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,

更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

优点:

1)、新的命令很容易被加入到系统里;

2)、允许接收请求的一方决定是否要否决请求;

3)、能较容易地设计一个命令队列;

4)、可以容易地实现对请求的Undo和Redo;

5)、在需要的情况下,可以较容易地将命令记入日志;


*********************************************************************


7、责任链模式


角色:抽象处理者(Handler)、具体处理者(ConcreteHandler)

行为:handleRequest;

Handler(successer、+handleRequest);

*********************************************************************


8、迭代子模式


角色:Iterator(抽象迭代子)、ConcreteIterator(迭代子)、聚集角色(Aggregate)、具体聚集角色(ConcreteAggregate);

Iterator(ConcreteIterator、+next())、Aggregate(+iterator());

*********************************************************************


9、观察者模式


角色:Subject(抽象主题)、ConcreteSubject(具体主题)、Observer(抽象观察者)、ConcreteObserver(具体观察者);

Subject(Vector<Observer>、+notify()、+add(Observer)、+remove(Observer)); Observer(+update());

观察者模式可以实现表示层和数据逻辑层的分离;

*********************************************************************


10、模板模式

行为:hookMethod、concreteMethod、abstractMethod

方法的实现延迟到子类

*********************************************************************


11、策略模式

针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以互相替换。策略模式使得算法可以在不影响到客户端的情况下发生变化;

角色:Context、Strategy、ConcreteStrategy;

行为:contextInterface、strategyInterface;

Context(strategy、+operate())、Strategy(+operate());

*********************************************************************


12、桥接模式

将抽象化与实现化脱藕,使得二者可以独立地变化;

角色:抽象化角色(Abstraction)、修正抽象化角色(Refined Abstraction)、实现化角色(Implementor)、具体实现化角色(Concrete Implementor);

Abstraction(Implementor、+operation())、Implementor(+operationImpl());

*********************************************************************


13、享元模式

共享池

*********************************************************************


14、代理模式


角色:subject、ProxySubject、RealSubject;

subject(+request())、ProxySubject(RealSubject、request()、+preRequest()、+postRequest())、RealSubject(+request());

反射、动态代理;


*********************************************************************


15、装饰模式

装饰者模式使用原来被装饰的类的一个子类的实现,把客户端的调用委派给被装饰类。

装饰模式的关键在于这种扩展是完全透明的。

角色:Component(抽象构件)、ConcreteComponent(具体构件)、Decorator(装饰者模式)、ConcreteDecorator(具体装饰者模式);

Component(+sampleOperation())、Decorator(Component、+sampleOperation());


*********************************************************************


16、合成模式

角色:Component(抽象节点)、Composite(子节点)、Leaf(叶子节点)

Component(Composite、+sampleOperation())、Composite(Vector<Component>、+sampleOperation()、+add/remove())、Leaf(+sampleOperation());


*********************************************************************


17、适配器模式

角色:Target(目标接口)、Adaptee(源角色)、Adapter(适配器);

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

*********************************************************************


18、原型模式

克隆

*********************************************************************


19、建造者模式

角色:Builder(抽象建造者)、ConcreteBuilder(具体建造者)、Director(导演者)、Product(产品)

Builder(+buildPart1()、+buildPart2()、+retrieveResult:product)、Director(Builder、+construct());

将一个产品的内部表象和产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象;

*********************************************************************

20、单例模式

私有化构造方法;

同步;


*********************************************************************


21、抽象工厂模式、工厂方法模式、简单工厂模式;


*********************************************************************


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纸牌游戏软件的人物角色具有入级(primary)、练级(secondary)、高手级(professional)三个级别。 首先是入级(primary)阶段。在游戏刚开始时,玩家扮演的角色处于入级阶段,刚刚接触游戏,对规则和策略还不太悉。在这个阶段,玩家可以通过新手教程和自由练习来磨砺技能,掌握基本的操作和战术,逐渐提升自己的游戏实力。 然后是练级(secondary)阶段。在逐渐悉游戏后,玩家可以进入练级阶段。这个阶段的玩家已经掌握了游戏的基本规则和策略,能够玩得稍微复杂一些的牌局。他们可以参与一些线上比赛、挑战任务或者与其他玩家进行对战,通过与其他练级玩家的交流与切磋,不断提高自己的水平。 最后是高手级(professional)阶段。在将练的游戏技巧发挥到极致后,玩家可以进入高手级阶段。这个阶段的玩家已经具备了极高的牌技和战术思维,能够应对各种复杂和挑战性的牌局。他们可以参加高级比赛或者组建自己的团队来参与团队赛,在比赛展示高超的技艺。同时,他们还可以担任教练或者评论员等角色,与其他玩家分享自己的经验和技巧。 总之,某纸牌游戏软件的人物角色具有入级、练级和高手级三个级别。玩家可以通过不断练习和挑战来逐渐提高自己的水平,从入门初学者到牌艺高手,不断探索游戏的乐趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值