- 浏览: 299092 次
- 性别:
- 来自: 东京
文章分类
最新评论
-
80后的童年2:
企业级分布式搜索平台Solr视频教程网盘地址:https:// ...
企业级搜索引擎Solr使用入门指南 -
springdata_spring:
apache lucene开源框架demo使用实例教程源代码下 ...
Lucene / Solr 开发经验 -
springdata-jpa:
java web开发分页demo源代码下载:http://ww ...
简易java分页标签 -
zjf_sdnu:
兄弟,script写错了
jqGrid初学备注 -
85600367:
你好,请教一个问题。当进行分布式查询时solr无法查询到Luc ...
Lucene / Solr 开发经验
责任链模式(Chain of Responsibility)
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。从定义上可以看出,责任链模式的提出是为了“解耦”,以应变系统需求的变更和不明确性。
该模式又包含两种处理思想。纯的责任链模式,规定一个具体处理者角色只能对请求作出两种动作:自己处理;传给
下家。不能出现处理了一部分,把剩下的传给了下家的情况。而且请求在责任链中必须被处理,而不能出现无果而终的结局。反之,则就是不纯的责任链模式。具体由两个角色组成:
- 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
- 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。
适用范围:
- 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定。
一个较佳的例子就是Java的例外处理机制,当程式中发生例外时,也比会catch所捕捉的例外是否符合,如果符合就执行所设定的处理,如果都没有比对到适当的例外物件,就会将例外丢出try...catch区块之外。另一简单例子如下:
//抽象处理者角色 public class Handler { private Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } public Handler getSuccessor() { return successor; } public void handleRequest(char c) { if (successor != null) successor.handleRequest(c); } } //具体处理者角色 public class SymbolHandler extends Handler { public void handleRequest(char c) { System.out.println("Symbol has been handled"); } } public class CharacterHandler extends Handler { public void handleRequest(char c) { if (Character.isLetter(c)) { System.out.println("Character has been handled"); } else { getSuccessor().handleRequest(c); } } } public class NumberHandler extends Handler { public void handleRequest(char c) { if (Character.isDigit(c)) { System.out.println("Number has been handled"); } else { getSuccessor().handleRequest(c); } } } //具体使用 public class Application { public static void main(String[] args) throws IOException { Handler numberHandler = new NumberHandler(); Handler characterHandler = new CharacterHandler(); Handler symbolHandler = new SymbolHandler(); numberHandler.setSuccessor(characterHandler); characterHandler.setSuccessor(symbolHandler); System.out.print("Press any key then return: "); char c = (char)System.in.read(); numberHandler.handleRequest(c); } }
不足:责任链模式优点,上面已经体现出来了。无非就是降低了耦合、提高了灵活性。但是责任链模式可能会带来一些额外的性能损耗,因为它每次执行请求都要从链子开头开始遍历。
命令模式(Command)
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。该模式由以下角色组成:
- 命令角色(Command):声明执行操作的接口。由Java接口或者抽象类来实现。
- 具体命令角色(Concrete Command):将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现命令角色声明的执行操作的接口。
- 客户角色(Client):创建一个具体命令对象(并可以设定它的接收者)。
- 请求者角色(Invoker):调用命令对象执行这个请求。
- 接收者角色(Receiver):知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
这个组成比较复杂,下面看一个简单的例子:
//请求者角色 public class Invoker { private Map commands; public Invoker() { commands = new HashMap(); } public void addCommand(String commName, ICommand command) { commands.put(commName, command); } public void request(String commName) { ICommand command = (ICommand) commands.get(commName); command.execute(); } } //命令角色 public interface ICommand { public void execute(); } //接收者角色 public class UpperCaseHello implements ICommand { private String name; public UpperCaseHello(String name) { this.name = name; } public void execute() { System.out.println("HELLO, " + name.toUpperCase()); } } public class LowerCaseHello implements ICommand { private String name; public LowerCaseHello(String name) { this.name = name; } public void execute() { System.out.println("hello, " + name.toLowerCase()); } } //具体命令角色和客户角色 public class Client { public static void main(String[] args) { Invoker invoker = new Invoker(); invoker.addCommand("JUSTIN", new UpperCaseHello("Justin")); invoker.addCommand("momor", new LowerCaseHello("momor")); // simulate random request String[] req = {"JUSTIN", "momor"}; while (true) { int i = (int) (Math.random() * 10) % 2; invoker.request(req[i]); } } }
该模式有待进一步研究。
迭代器模式(Iterator)
迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF 给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。该模式由以下角色组成:
- 迭代器角色(Iterator):负责定义访问和遍历元素的接口。
- 具体迭代器角色(Concrete Iterator):实现迭代器接口,并要记录遍历中的当前位置。
- 容器角色(Container):负责提供创建具体迭代器角色的接口。
- 具体容器角色(Concrete Container):实现创建具体迭代器角色的接口。
public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { //create concrete iterator public Iterator<E> iterator() { return new Itr(); } private class Itr implements Iterator<E> { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } } }
- 支持以不同的方式遍历一个容器角色。根据实现方式的不同,效果上会有差别。
- 简化了容器的接口。但是在java Collection中为了提高可扩展性,容器还是提供了遍历的接口。
- 对同一个容器对象,可以同时进行多个遍历。因为遍历状态是保存在每一个迭代器对象中的。
- 在迭代器遍历的过程中,通过该迭代器进行容器元素的增减操作是否安全呢?
- 在容器中存在复合对象的情况,迭代器怎样才能支持深层遍历和多种遍历呢?
中介者模式(Mediator):
GOF 给中介者模式下的定义是:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“中介”对象,使得两头的对象分别和“中介”对象引用或者依赖。该模式的组成部分:
- 抽象中介者(Mediator)角色:定义统一的接口用于各同事角色之间的通信。
- 具体中介者(Concrete Mediator)角色:通过协调各同事角色实现协作行为,为此它要知道并引用各个同事角色。
- 同事(Colleague)角色:每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作。
在结构上,中介者模式与观察者模式、命令模式都添加了中间对象——只是中介者去掉了后两者在行为上的方向。因此中介者的应用可以仿照后两者的例子去写。但是观察者模式、命令模式中的观察者、命令都是被客户所知的,具体哪个观察者、命令的应用都是由客户来指定的。而大多中介者角色对于客户程序却是透明的。当然造成这种区别的原因是由于它们要达到的目的不同。
从目的上看,调停者模式与观察者模式、命令模式便没有了任何关系,倒是与门面模式有些相似。但是门面模式是介于客户程序与子系统之间的,而中介者模式是介于子系统与子系统之间的。这也注定了它们有很大的区别:门面模式是将原有的复杂逻辑提取到一个统一的接口,简化客户对逻辑的使用。它是被客户所感知的,而原有的复杂逻辑则被隐藏了起来。而中介
者模式的加入并没有改变客户原有的使用习惯,它是隐藏在原有逻辑后面的,使得代码逻辑更加清晰可用。
备忘录模式(Memento)
备忘录(Memento)模式又称标记(Token)模式。GOF给备忘录模式的定义为:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
其实单就实现保存一个对象在某一时刻的状态的功能,还是很简单的——将对象中要保存的属性放到一个专门管理备份的对象中,需要的时候则调用约定好的方法将备份的属性放回到原来的对象中去。但是你要好好看看为了能让你的备份对象访问到原对象中的属性,是否意味着你就要全部公开或者包内公开对象原本私有的属性呢?如果你的做法已经破坏了封装,那么就要考虑重构一下了。
下面是备忘录模式的组成部分:
- 备忘录(Memento)角色:存储“备忘发起角色”的内部状态。“备忘发起角色”根据需要决定备忘录角色存储“备忘发起角色”的哪些内部状态。为了防止“备忘发起角色”以外的其他对象访问备忘录,备忘录实际上有两个接口,“备忘录管理者角色”只能看到备忘录提供的窄接口——对于备忘录角色中存放的属性是不可见的。“备忘发起角色”则能够看到一个宽接口——能够得到自己放入备忘录角色中属性。
- 备忘发起(Originator)角色:该角色创建一个备忘录,用以记录当前时刻它的内部状态,在需要时使用备忘录恢复内部状态。
- 备忘录管理者(Caretaker)角色:负责保存好备忘录,不能对备忘录的内容进行操作或检查。
下面对三种在 Java 中可保存封装的方法进行探讨。
class Originator { //这个是要保存的状态 private int state= 90; //保持一个“备忘录管理者角色”的对象 private Caretaker c = new Caretaker(); //读取备忘录角色以恢复以前的状态 public void setMemento(){ Memento memento = (Memento) c.getMemento(); state = memento.getState(); System.out.println("the state is "+state+" now"); } //创建一个备忘录角色,并将当前状态属性存入,托给“备忘录管理者角色”存放。 public void createMemento(){ c.saveMemento(new Memento(state)); } //作为私有内部类的备忘录角色,它实现了窄接口,可以看到在第二种方法中宽接口已经不再需要。注意:里面的属性和方法都是私有的 private class Memento implements MementoIF { private int state ; private Memento(int state){ this.state = state ; } private int getState(){ return state; } } } //窄接口 interface MementoIF {} //备忘录管理者角色 class Caretaker { private MementoIF m ; public void saveMemento(MementoIF m) { this.m = m; } public MementoIF getMemento() { return m; } }
- 必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
- 如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
观察者模式(Observer)
观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF 给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
该模式由以下部分组成:
- 抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现。
- 抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要由抽象类或者接口来实现。
- 具体目标角色(Concrete Subject):将有关状态存入各个Concrete Observer对象。当它的状态发生改变时,向它的各个观察者发出通知。
- 具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。在本角色内也可以维护一个指向Concrete Subject对象的引用。
观察者模式在关于目标角色、观察者角色通信的具体实现中,有两个版本:
- 一种情况便是目标角色在发生变化后,仅仅告诉观察者角色“我变化了”,观察者角色如果想要知道具体的变化细节,则就要自己从目标角色的接口中得到。这种模式被很形象的称为:拉模式 - 就是说变化的信息是观察者角色主动从目标角色中“拉”出来的。
- 还有一种方法,那就是目标角色“服务一条龙”,通知你发生变化的同时,通过一个参数将变化的细节传递到观察者角色中去。这就是“推模式” - 管你要不要,先给你。这两种模式的使用,取决于系统设计时的需要。如果目标角色比较复杂,并且观察者角色进行更新时必须得到一些具体变化的信息,则“推模式”比较合适。如果目标角色比较简单,则“拉模式”就很合适。
适用范围:
- 当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
- 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
- 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。
策略模式(Strategy)
策略模式(Strategy)主要是定义一系列的算法,把这些算法一个个封装成拥有共同接口的单独的类,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响的变化。这里的算法不要狭义的理解为数据结构中的算法,可以理解为不同的业务处理方法。
先由定义来想象下它的结构吧。要使算法拥有共同的接口,这样就要实现一个接口或者一个抽象类出来才行:
- 算法使用环境(Context)角色:算法被引用到这里和一些其它的与环境有关的操作一起来完成任务。
- 抽象策略(Strategy)角色:规定了所有具体策略角色所需的接口。在Java它通常由接口或者抽象类来实现。
- 具体策略(Concrete Strategy)角色:实现了抽象策略角色定义的接口。
- 系统需要能够在几种算法中快速的切换。
- 系统中有一些类它们仅行为不同时,可以考虑采用策略模式来进行重构。
- 系统中存在多重条件选择语句时,可以考虑采用策略模式来重构。
- 但是要注意一点,策略模式中不可以同时使用多于一个的算法。
状态模式(State)
GOF《设计模式》中给状态模式下的定义为:允许一个对象在其内部状态改变时改变它的行为。
能够让程序根据不同的外部情况来做出不同的响应,最直接的方法就是在程序中将这些可能发生的外部情况全部考虑到,使用if else语句来进行代码响应选择。但是这种方法对于复杂一点的状态判断,就会显得杂乱无章,容易产生错误。而且增加一个新的状态将会带来大量的修改。这个时候“能够修改自身”的状态模式的引入也许是个不错的主意。
由简单的开始会比较好理解状态模式的作用,先来看一个例子,如果您有一个只能顺时针转动的瓦斯开关,转动一次的状态为off、 small fire、medium fire与large fire,您如何在程序中控制状态的变化与行为呢?一个最简单的方式就是用if..else或是switch流程来控制,例如:
public class State { private int state; public State() { state = 0; } public void switchFire() { if (state == 0) { state = 1; System.out.println( "small fire" ); } else if (state == 1) { state = 2; System.out.println( "medium fire" ); } else if (state == 2) { state = 3; System.out.println( "large fire" ); } else { state = 0; System.out.println( "turning off" ); } } }
这个方法很简单,每个人都会,但如果您的状态变化并不是流水式的变化,而是像TCP连线状态一样,会是一个网络图的时候,用 if...else或switch来写的话,您的程序就会乱的不像话了;来考虑如何让物件控制自己的状态转换与所应表现的行为,这个程序可以这样改写:
public interface IState { public void switchFire(FireSwitch sw); } public class OffState implements IState { public void switchFire(FireSwitch sw) { sw.setState(new SmallState()); System.out.println( "small fire" ); } } public class SmallState implements IState { public void switchFire(FireSwitch sw) { sw.setState(new MediumState()); System.out.println( "medium fire" ); } } public class MediumState implements IState { public void switchFire(FireSwitch sw) { sw.setState(new LargeState()); System.out.println( "large fire" ); } } public class LargeState implements IState { public void switchFire(FireSwitch sw) { sw.setState(new OffState()); System.out.println( "off fire" ); } } public class FireSwitch { private State current; public FireSwitch() { current = new OffState(); } public void setState(State s) { current = s; } public void switchFire() { current.switchFire(this); } }
适用情况:
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。
状态 VS 策略:
模板模式(Template Method)
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
- 控制子类扩展,模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。
访问者模式(Visitor)
- 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。
- 具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。
- 元素角色(Element):定义一个Accept操作,它以一个访问者为参数。
- 具体元素角色(Concrete Element):实现由元素角色提供的 Accept 操作。
- 对象结构角色(Object Structure):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。
public class ElementA { // some implementing } public class ElementB { // some implementing } public class ElementC { // some implementing } // ...... Iterator iterator = arrayList.iterator() while (iterator.hasNext()) { if (o instanceof ElementA) (ElementA) o.operationA(); else if (o instanceof ElementB) (ElementB) o.operationB(); else if (o instanceof ElementC) (ElementC) o.operationC(); else System.out.println("Sorry! I don't know who you are! " + o.toString()); } //....
public interface IElement { public void accept(IVisitor visitor); } public class ElementA implements IElement { public void accept(IVisitor visitor) { visitor.visit(this); } public void operationA() { System.out.println("do A's job...."); } } public class ElementB implements IElement { public void accept(IVisitor visitor) { visitor.visit(this); } public void operationB() { System.out.println("do B's job...."); } } public class ElementC implements IElement { public void accept(IVisitor visitor) { visitor.visit(this); } public void operationC() { System.out.println("do C's job...."); } } public interface IVisitor { public void visit(ElementA element); public void visit(ElementB element); public void visit(ElementC element); } public class VisitorA implements IVisitor { public void visit(ElementA element) { element.operationA(); } public void visit(ElementB element) { element.operationB(); } public void visit(ElementC element) { element.operationC(); } } public class Main { public static void main(String[] args) { // know nothing about their type // after storing them into Element array IElement[] list = {new ElementA(), new ElementB(), new ElementC()}; IVisitor visitor = new VisitorA(); for (int i=0; i < list.length; i++) list[i].accept(visitor); } }
- 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。
- 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
- 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
发表评论
-
Eclipse快捷键
2011-12-22 14:05 1370好久没用了,再回顾一下,免得忘了。 编辑 ... -
设计模式备忘 - 结构型
2010-03-28 17:50 1274适配器模式(Adapter) 将一个类的接口转换成客户希望的 ... -
设计模式备忘 - 创建型
2010-03-28 16:04 1217工厂模式 工厂模式主 ... -
SVN同步备份
2009-05-30 22:59 2942首先建立一个空的repository,svnadmin cre ... -
Eclipse下配置Tomcat debug
2009-05-24 21:16 8209Eclipse下自带有Tomcat debug插件,不过该插件 ... -
Jboss SSL on Debian
2009-03-22 12:17 12601. Generate self-signed certifi ... -
IzPack使用备注
2009-02-11 01:05 3802install.xml <?xml version=&q ... -
Maven初学备注
2009-01-06 23:35 3476项目生命周期:process-resources -> ... -
How to integrate Solr and Jboss
2008-09-11 22:50 1862本文转自 http://www.mail-archive.co ... -
什么是JMX?
2008-08-28 21:31 1360转自:http://www.blogjava.net/mlh1 ... -
JNLP介绍
2008-08-02 17:44 3013原文地址:http://blog.csdn.net/yq760 ... -
Apache虚拟主机配置
2008-07-10 16:42 3307Apache虚拟主机配置 来自 Clay的日记 ... -
Apache配置.htaccess\.htpasswd
2008-07-10 16:59 2749Apache配置.htaccess\.htpasswd 来自 ... -
Apache服务器中的URL重写的配置和应用
2008-07-10 17:15 2367Apache服务器中的URL重写的配置和应用 来自 Clay的 ... -
Log4j常用配置
2008-01-31 18:25 1835常用log4j配置,一般可以采用两种方式,.propertie ... -
SVN常用目录结构
2007-12-26 22:29 5131特殊目录名说明 trunk 主干,存储最新稳定版本 tag ... -
Windows下SVN服务器的搭建
2007-12-26 22:25 85381,软件下载 下载Subvers ... -
针对ECLIPSE的SUBVERSION插件
2007-12-15 16:30 3367摘要 Subversion (SVN) ...
相关推荐
JAVA-设计模式-行为型模式-备忘录模式
c++设计模式-行为型模式-备忘录模式;qt工程;c++简单源码;备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先...
3. **行为型模式**:这类模式关注对象之间的责任分配。 - 责任链模式(Chain of Responsibility):避免将请求的发送者和接收者耦合在一起,使得多个对象都有可能处理请求。 - 命令模式(Command):将请求封装为...
设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略模式、模板方法、访问者 此PPT实例便于...
在上述内容中,提到了七种行为型设计模式,分别是责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式。 1. **责任链模式**:责任链模式的核心是建立一个对象链,每个对象都有处理请求的能力,...
根据GOF的定义,设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。创建型模式解决了对象的创建问题,结构型模式解决了对象的组合问题,行为型模式解决了对象的行为问题。 创建型模式包括Factory ...
设计模式一般分为三大类:创建型模式、结构型模式和行为型模式。 3. 根据文件内容,诸葛亮给赵云的三个锦囊妙计可以用策略模式来实现。每个妙计对应一个实现了策略接口的具体策略类。例如,BackDoor类实现了...
### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象...
这23种设计模式可以分为三类:创建型、结构型和行为型。 1. 创建型设计模式: - 单例模式:保证一个类只有一个实例,并提供全局访问点。 - 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类...
3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility):避免将请求的发送者和接收者耦合在一起,使得多个对象都有可能处理请求。 - 命令模式(Command):将一个请求封装为一个对象,...
- **1.1 Factory模式**:工厂模式是一种创建型设计模式,它提供了创建对象的最佳方法。这种模式涉及一个创建对象的接口,但它让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 - **1.2 Abstract...
设计模式分为三大类:创建型模式、结构型模式和行为型模式。 1. 创建型模式:这类模式涉及到对象的创建,如单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。例如,单例模式确保一个类只有一个实例,...
这些模式分为创建型、结构型和行为型三大类,涵盖了多种软件设计原则和技巧,对于提升代码的可读性、可维护性和可扩展性有着重要的作用。 首先,让我们逐一探讨这23种设计模式: 1. **工厂模式**:提供一个接口来...
在给定的文档中,提到了23种设计模式中的几种行为型模式,包括责任链模式、迭代器模式、中介者模式、命令模式、解释器模式、访问者模式、策略模式、模板方法模式、状态模式、观察者模式以及备忘录模式。下面将对这些...
设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代器、访问者、备忘录、...
c#设计模式 行为型模式 包括8个设计模式的实验报告+源代码。实验报告包括实验类图和个人总结的一些小技巧,源代码。包括:职责链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略...
按照不同的功能特性,设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 #### 二、创建型模式 创建型模式主要用于解决对象创建的过程,旨在简化对象创建的复杂度,同时保持对象创建的灵活性。主要...
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到先前的状态。这种模式在需要撤销/重做功能、...