当前位置: 首页 > news >正文

满山红厦门网站建设互联网官网

满山红厦门网站建设,互联网官网,建一个网站怎么赚钱吗, 在线地址最新版前言 本文为 【23种设计模式】行为型模式 相关内容介绍#xff0c;下边将对访问者模式#xff0c;模板模式#xff0c;策略模式#xff0c;状态模式#xff0c;观察者模式#xff0c;备忘录模式#xff0c;中介者模式#xff0c;迭代器模式#xff0c;解释器模式…前言 本文为 【23种设计模式】行为型模式 相关内容介绍下边将对访问者模式模板模式策略模式状态模式观察者模式备忘录模式中介者模式迭代器模式解释器模式命令模式责任链模式具体包括它们的特点与实现等进行详尽介绍~ 博主主页小新要变强 的主页 Java全栈学习路线可参考【Java全栈学习路线】最全的Java学习路线及知识清单Java自学方向指引内含最全Java全栈学习技术清单~ 算法刷题路线可参考算法刷题路线总结与相关资料分享内含最详尽的算法刷题路线指南及相关资料分享~ Java微服务开源项目可参考企业级Java微服务开源项目开源框架用于学习、毕设、公司项目、私活等减少开发工作让您只关注业务 目录 行为型模式详细介绍前言目录一、访问者模式1️⃣介绍2️⃣实现二、模板模式1️⃣介绍2️⃣实现三、策略模式1️⃣介绍2️⃣实现四、状态模式1️⃣介绍2️⃣实现五、观察者模式1️⃣介绍2️⃣实现六、备忘录模式1️⃣介绍2️⃣实现后记一、访问者模式 在访问者模式Visitor Pattern中我们使用了一个访问者类它改变了元素类的执行算法。通过这种方式元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式元素对象已接受访问者对象这样访问者对象就可以处理元素对象上的操作。 1️⃣介绍 意图 主要将数据结构与数据操作分离。 主要解决 稳定的数据结构和易变的操作耦合问题。 何时使用 需要对一个对象结构中的对象进行很多不同的并且不相关的操作而需要避免让这些操作污染这些对象的类使用访问者模式将这些封装到类中。 如何解决 在被访问的类里面加一个对外提供接待访问者的接口。 关键代码 在数据基础类里面有一个方法接受访问者将自身引用传入访问者。 应用实例 您在朋友家做客您是访问者朋友接受您的访问您通过朋友的描述然后对朋友的描述做出一个判断这就是访问者模式。 优点 1、符合单一职责原则。2、优秀的扩展性。3、灵活性。 缺点 1、具体元素对访问者公布细节违反了迪米特原则。2、具体元素变更比较困难。3、违反了依赖倒置原则依赖了具体类没有依赖抽象。 使用场景 1、对象结构中对象对应的类很少改变但经常需要在此对象结构上定义新的操作。2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作而需要避免让这些操作污染这些对象的类也不希望在增加新操作时修改这些类。 注意事项 访问者可以对功能进行统一可以做报表、UI、拦截器与过滤器。 2️⃣实现 我们将创建一个定义接受操作的 ComputerPart 接口。Keyboard、Mouse、Monitor 和 Computer 是实现了 ComputerPart 接口的实体类。我们将定义另一个接口 ComputerPartVisitor它定义了访问者类的操作。Computer 使用实体访问者来执行相应的动作。 VisitorPatternDemo我们的演示类使用 Computer、ComputerPartVisitor 类来演示访问者模式的用法。 1定义一个表示元素的接口。 ComputerPart.java public interface ComputerPart {public void accept(ComputerPartVisitor computerPartVisitor); }2创建扩展了上述类的实体类。 Keyboard.java public class Keyboard implements ComputerPart {Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);} }Monitor.java public class Monitor implements ComputerPart {Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);} }Mouse.java public class Mouse implements ComputerPart {Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);} }Computer.java public class Computer implements ComputerPart {ComputerPart[] parts;public Computer(){parts new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()}; } Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {for (int i 0; i parts.length; i) {parts[i].accept(computerPartVisitor);}computerPartVisitor.visit(this);} }3定义一个表示访问者的接口。 ComputerPartVisitor.java public interface ComputerPartVisitor {public void visit(Computer computer);public void visit(Mouse mouse);public void visit(Keyboard keyboard);public void visit(Monitor monitor); }4创建实现了上述类的实体访问者。 ComputerPartDisplayVisitor.java public class ComputerPartDisplayVisitor implements ComputerPartVisitor {Overridepublic void visit(Computer computer) {System.out.println(Displaying Computer.);}Overridepublic void visit(Mouse mouse) {System.out.println(Displaying Mouse.);}Overridepublic void visit(Keyboard keyboard) {System.out.println(Displaying Keyboard.);}Overridepublic void visit(Monitor monitor) {System.out.println(Displaying Monitor.);} }5使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分。 VisitorPatternDemo.java public class VisitorPatternDemo {public static void main(String[] args) {ComputerPart computer new Computer();computer.accept(new ComputerPartDisplayVisitor());} }6执行程序 输出结果 Displaying Mouse. Displaying Keyboard. Displaying Monitor. Displaying Computer.二、模板模式 在模板模式Template Pattern中一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 1️⃣介绍 意图 定义一个操作中的算法的骨架而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 主要解决 一些方法通用却在每一个子类都重新写了这一方法。 何时使用 有一些通用的方法。 如何解决 将这些通用算法抽象出来。 关键代码 在抽象类实现其他步骤在子类实现。 应用实例 1、在造房子的时候地基、走线、水管都一样只有在建筑的后期才有加壁橱加栅栏等差异。2、西游记里面菩萨定好的 81 难这就是一个顶层的逻辑骨架。3、spring 中对 Hibernate 的支持将一些已经定好的方法封装起来比如开启事务、获取 Session、关闭 Session等程序员不重复写那些已经规范好的代码直接丢一个实体就可以保存。 优点 1、封装不变部分扩展可变部分。2、提取公共代码便于维护。3、行为由父类控制子类实现。 缺点 每一个不同的实现都需要一个子类来实现导致类的个数增加使得系统更加庞大。 使用场景 1、有多个子类共有的方法且逻辑相同。2、重要的、复杂的方法可以考虑作为模板方法。 注意事项 为防止恶意操作一般模板方法都加上 final 关键词。 2️⃣实现 我们将创建一个定义操作的 Game 抽象类其中模板方法设置为 final这样它就不会被重写。Cricket 和 Football 是扩展了 Game 的实体类它们重写了抽象类的方法。 TemplatePatternDemo我们的演示类使用 Game 来演示模板模式的用法。 1创建一个抽象类它的模板方法被设置为 final。 Game.java public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();//模板public final void play(){//初始化游戏initialize();//开始游戏startPlay();//结束游戏endPlay();} }2创建扩展了上述类的实体类。 Cricket.java public class Cricket extends Game {Overridevoid endPlay() {System.out.println(Cricket Game Finished!);}Overridevoid initialize() {System.out.println(Cricket Game Initialized! Start playing.);}Overridevoid startPlay() {System.out.println(Cricket Game Started. Enjoy the game!);} }Football.java public class Football extends Game {Overridevoid endPlay() {System.out.println(Football Game Finished!);}Overridevoid initialize() {System.out.println(Football Game Initialized! Start playing.);}Overridevoid startPlay() {System.out.println(Football Game Started. Enjoy the game!);} }3使用 Game 的模板方法 play() 来演示游戏的定义方式。 TemplatePatternDemo.java public class TemplatePatternDemo {public static void main(String[] args) {Game game new Cricket();game.play();System.out.println();game new Football();game.play(); } }4执行程序 输出结果 Cricket Game Initialized! Start playing. Cricket Game Started. Enjoy the game! Cricket Game Finished!Football Game Initialized! Start playing. Football Game Started. Enjoy the game! Football Game Finished!三、策略模式 在策略模式Strategy Pattern中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 1️⃣介绍 意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决 在有多种算法相似的情况下使用 if…else 所带来的复杂和难以维护。 何时使用 一个系统有许多许多类而区分它们的只是他们直接的行为。 如何解决 将这些算法封装成一个一个的类任意地替换。 关键代码 实现同一个接口。 应用实例 1、诸葛亮的锦囊妙计每一个锦囊就是一个策略。2、旅行的出游方式选择骑自行车、坐汽车每一种旅行方式都是一个策略。3、JAVA AWT 中的 LayoutManager。 优点 1、算法可以自由切换。2、避免使用多重条件判断。3、扩展性良好。 缺点 1、策略类会增多。2、所有策略类都需要对外暴露。 使用场景 1、如果在一个系统里面有许多类它们之间的区别仅在于它们的行为那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。2、一个系统需要动态地在几种算法中选择一种。3、如果一个对象有很多的行为如果不用恰当的模式这些行为就只好使用多重的条件选择语句来实现。 注意事项 如果一个系统的策略多于四个就需要考虑使用混合模式解决策略类膨胀的问题。 2️⃣实现 我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。 StrategyPatternDemo我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。 1创建一个接口。 Strategy.java public interface Strategy {public int doOperation(int num1, int num2); }2创建实现接口的实体类。 OperationAdd.java public class OperationAdd implements Strategy{Overridepublic int doOperation(int num1, int num2) {return num1 num2;} }OperationSubtract.java public class OperationSubtract implements Strategy{Overridepublic int doOperation(int num1, int num2) {return num1 - num2;} } OperationMultiply.java public class OperationMultiply implements Strategy{Overridepublic int doOperation(int num1, int num2) {return num1 * num2;} }4创建 Context 类。 Context.java public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);} }5使用 Context 来查看当它改变策略 Strategy 时的行为变化。 StrategyPatternDemo.java public class StrategyPatternDemo {public static void main(String[] args) {Context context new Context(new OperationAdd()); System.out.println(10 5 context.executeStrategy(10, 5));context new Context(new OperationSubtract()); System.out.println(10 - 5 context.executeStrategy(10, 5));context new Context(new OperationMultiply()); System.out.println(10 * 5 context.executeStrategy(10, 5));} }5执行程序 输出结果 10 5 15 10 - 5 5 10 * 5 50四、状态模式 在状态模式State Pattern中类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 1️⃣介绍 意图 允许对象在内部状态发生改变时改变它的行为对象看起来好像修改了它的类。 主要解决 对象的行为依赖于它的状态属性并且可以根据它的状态改变而改变它的相关行为。 何时使用 代码中包含大量与对象状态有关的条件语句。 如何解决 将各种具体的状态类抽象出来。 关键代码 通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且状态模式的实现类的方法一般返回值或者是改变实例变量的值。也就是说状态模式一般和对象的状态有关。实现类的方法有不同的功能覆盖接口中的方法。状态模式和命令模式一样也可以用于消除 if…else 等条件选择语句。 应用实例 1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。2、曾侯乙编钟中‘钟是抽象接口’,钟A’等是具体状态曾侯乙编钟’是具体环境Context。 优点 1、封装了转换规则。2、枚举可能的状态在枚举状态之前需要确定状态种类。3、将所有与某个状态有关的行为放到一个类中并且可以方便地增加新的状态只需要改变对象状态即可改变对象的行为。4、允许状态转换逻辑与状态对象合成一体而不是某一个巨大的条件语句块。5、可以让多个环境对象共享一个状态对象从而减少系统中对象的个数。 缺点 1、状态模式的使用必然会增加系统类和对象的个数。2、状态模式的结构与实现都较为复杂如果使用不当将导致程序结构和代码的混乱。3、状态模式对开闭原则的支持并不太好对于可以切换状态的状态模式增加新的状态类需要修改那些负责状态转换的源代码否则无法切换到新增状态而且修改某个状态类的行为也需修改对应类的源代码。 使用场景 1、行为随状态改变而改变的场景。2、条件、分支语句的代替者。 注意事项 在行为受状态约束的时候使用状态模式而且状态不超过 5 个。 2️⃣实现 我们将创建一个 State 接口和实现了 State 接口的实体状态类。Context 是一个带有某个状态的类。 StatePatternDemo我们的演示类使用 Context 和状态对象来演示 Context 在状态改变时的行为变化。 1创建一个接口。 State.java public interface State {public void doAction(Context context); }2创建实现接口的实体类。 StartState.java public class StartState implements State {public void doAction(Context context) {System.out.println(Player is in start state);context.setState(this); }public String toString(){return Start State;} }StopState.java public class StopState implements State {public void doAction(Context context) {System.out.println(Player is in stop state);context.setState(this); }public String toString(){return Stop State;} }3创建 Context 类。 Context.java public class Context {private State state;public Context(){state null;}public void setState(State state){this.state state; }public State getState(){return state;} }4使用 Context 来查看当状态 State 改变时的行为变化。 StatePatternDemo.java public class StatePatternDemo {public static void main(String[] args) {Context context new Context();StartState startState new StartState();startState.doAction(context);System.out.println(context.getState().toString());StopState stopState new StopState();stopState.doAction(context);System.out.println(context.getState().toString());} }5执行程序 输出结果 Player is in start state Start State Player is in stop state Stop State五、观察者模式 当对象间存在一对多关系时则使用观察者模式Observer Pattern。比如当一个对象被修改时则会自动通知依赖它的对象。观察者模式属于行为型模式。 1️⃣介绍 意图 定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。 主要解决 一个对象状态改变给其他对象通知的问题而且要考虑到易用和低耦合保证高度的协作。 何时使用 一个对象目标对象的状态发生改变所有的依赖对象观察者对象都将得到通知进行广播通知。 如何解决 使用面向对象技术可以将这种依赖关系弱化。 关键代码 在抽象类里有一个 ArrayList 存放观察者们。 应用实例 1、拍卖的时候拍卖师观察最高标价然后通知给其他竞价者竞价。2、西游记里面悟空请求菩萨降服红孩儿菩萨洒了一地水招来一个老乌龟这个乌龟就是观察者他观察菩萨洒水这个动作。 优点 1、观察者和被观察者是抽象耦合的。2、建立一套触发机制。 缺点 1、如果一个被观察者对象有很多的直接和间接的观察者的话将所有的观察者都通知到会花费很多时间。2、如果在观察者和观察目标之间有循环依赖的话观察目标会触发它们之间进行循环调用可能导致系统崩溃。3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的而仅仅只是知道观察目标发生了变化。 使用场景 一个抽象模型有两个方面其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。一个对象的改变将导致其他一个或多个对象也发生改变而不知道具体有多少对象将发生改变可以降低对象之间的耦合度。一个对象必须通知其他对象而并不知道这些对象是谁。需要在系统中创建一个触发链A对象的行为将影响B对象B对象的行为将影响C对象……可以使用观察者模式创建一种链式触发机制。 注意事项 1、JAVA 中已经有了对观察者模式的支持类。2、避免循环引用。3、如果顺序执行某一观察者错误会导致系统卡壳一般采用异步方式。 2️⃣实现 观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。 ObserverPatternDemo我们的演示类使用 Subject 和实体类对象来演示观察者模式。 1创建 Subject 类。 Subject.java import java.util.ArrayList; import java.util.List;public class Subject {private ListObserver observers new ArrayListObserver();private int state;public int getState() {return state;}public void setState(int state) {this.state state;notifyAllObservers();}public void attach(Observer observer){observers.add(observer); }public void notifyAllObservers(){for (Observer observer : observers) {observer.update();}} }2创建 Observer 类。 Observer.java public abstract class Observer {protected Subject subject;public abstract void update(); }3创建实体观察者类。 BinaryObserver.java public class BinaryObserver extends Observer{public BinaryObserver(Subject subject){this.subject subject;this.subject.attach(this);}Overridepublic void update() {System.out.println( Binary String: Integer.toBinaryString( subject.getState() ) ); } }OctalObserver.java public class OctalObserver extends Observer{public OctalObserver(Subject subject){this.subject subject;this.subject.attach(this);}Overridepublic void update() {System.out.println( Octal String: Integer.toOctalString( subject.getState() ) ); } }HexaObserver.java public class HexaObserver extends Observer{public HexaObserver(Subject subject){this.subject subject;this.subject.attach(this);}Overridepublic void update() {System.out.println( Hex String: Integer.toHexString( subject.getState() ).toUpperCase() ); } }4使用 Subject 和实体观察者对象。 ObserverPatternDemo.java public class ObserverPatternDemo {public static void main(String[] args) {Subject subject new Subject();new HexaObserver(subject);new OctalObserver(subject);new BinaryObserver(subject);System.out.println(First state change: 15); subject.setState(15);System.out.println(Second state change: 10); subject.setState(10);} }5执行程序 输出结果 First state change: 15 Hex String: F Octal String: 17 Binary String: 1111 Second state change: 10 Hex String: A Octal String: 12 Binary String: 1010六、备忘录模式 备忘录模式Memento Pattern保存一个对象的某个状态以便在适当的时候恢复对象。备忘录模式属于行为型模式。 1️⃣介绍 意图 在不破坏封装性的前提下捕获一个对象的内部状态并在该对象之外保存这个状态。 主要解决 所谓备忘录模式就是在不破坏封装的前提下捕获一个对象的内部状态并在该对象之外保存这个状态这样可以在以后将对象恢复到原先保存的状态。 何时使用 很多时候我们总是需要记录一个对象的内部状态这样做的目的就是为了允许用户取消不确定或者错误的操作能够恢复到他原先的状态使得他有后悔药可吃。 如何解决 通过一个备忘录类专门存储对象状态。 关键代码 客户不与备忘录类耦合与备忘录管理类耦合。 应用实例 1、后悔药。2、打游戏时的存档。3、Windows 里的 ctrl z。4、IE 中的后退。5、数据库的事务管理。 优点 1、给用户提供了一种可以恢复状态的机制可以使用户能够比较方便地回到某个历史的状态。2、实现了信息的封装使得用户不需要关心状态的保存细节。 缺点 消耗资源。如果类的成员变量过多势必会占用比较大的资源而且每一次保存都会消耗一定的内存。 使用场景 1、需要保存/恢复数据的相关状态场景。2、提供一个可回滚的操作。 注意事项 1、为了符合迪米特原则还要增加一个管理备忘录的类。2、为了节约内存可使用原型模式备忘录模式。 2️⃣实现 备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。 MementoPatternDemo我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。 1创建 Memento 类。 Memento.java public class Memento {private String state;public Memento(String state){this.state state;}public String getState(){return state;} }2创建 Originator 类。 Originator.java public class Originator {private String state;public void setState(String state){this.state state;}public String getState(){return state;}public Memento saveStateToMemento(){return new Memento(state);}public void getStateFromMemento(Memento Memento){state Memento.getState();} }3创建 CareTaker 类。 CareTaker.java import java.util.ArrayList; import java.util.List;public class CareTaker {private ListMemento mementoList new ArrayListMemento();public void add(Memento state){mementoList.add(state);}public Memento get(int index){return mementoList.get(index);} }4使用 CareTaker 和 Originator 对象。 MementoPatternDemo.java public class MementoPatternDemo {public static void main(String[] args) {Originator originator new Originator();CareTaker careTaker new CareTaker();originator.setState(State #1);originator.setState(State #2);careTaker.add(originator.saveStateToMemento());originator.setState(State #3);careTaker.add(originator.saveStateToMemento());originator.setState(State #4);System.out.println(Current State: originator.getState()); originator.getStateFromMemento(careTaker.get(0));System.out.println(First saved State: originator.getState());originator.getStateFromMemento(careTaker.get(1));System.out.println(Second saved State: originator.getState());} }5验证输出。 Current State: State #4 First saved State: State #2 Second saved State: State #3后记 Java全栈学习路线可参考【Java全栈学习路线】最全的Java学习路线及知识清单Java自学方向指引内含最全Java全栈学习技术清单~ 算法刷题路线可参考算法刷题路线总结与相关资料分享内含最详尽的算法刷题路线指南及相关资料分享~
http://www.w-s-a.com/news/316973/

相关文章:

  • 网站布局教程wordpress 侧边栏位置
  • 谁有手机网站啊介绍一下dedecms 网站重复文章
  • 博客网站快速排名微信机器人免费版wordpress
  • 孝感网站建设xgshwordpress网站基础知识
  • 百度为什么会k网站长沙做网站找哪家好
  • 揭阳商城网站建设新闻稿发布平台
  • 电商网站建设免费在线优化网站
  • 厦门网站建设咨询挣钱最快的小游戏
  • 郑州网站网络营销莱芜雪野湖别墅
  • 安装iis8 添加网站河南省建设执业资格中心网站
  • 个人网站电商怎么做广州市营销型网站建设
  • 空间站做网站什么版本wordpress 勾子
  • win7网站服务器制作软件网站浏览图片怎么做的
  • 网站制作平台公司嵌入式软件开发环境
  • 网站服务器镜像微商做网站网站
  • 十大旅游电子商务网站网上定做衣服
  • 怎样进行网站备案上海发布公众号app
  • 网站后台模板论坛网站优化招商
  • 个人网站设计作品能用VUE做网站
  • 网站建设预付阿里云域名备案查询
  • 苏州本地网站免费咨询医生的软件
  • 个人网站做废品回收福建网站开发招聘
  • wordpress网站备案学设计常用的网站
  • 网站建设的频道是什么网站用什么开发软件做
  • 电子商务网站建设与规划总结外链查询网站
  • 西安网站品牌建设做网站需要的东西
  • 网站外围网站怎么做移动端网站开发项目
  • 做网站只做前端可以用吗知更鸟免费 wordpress
  • html5 微信网站主流开发技术标准网站搭建费用
  • 加强统计局网站的建设和管理广州微信网站建设价格