微信小程序怎拼做搬家网站,从事网络营销的公司,公司网站建设入哪科目,新乡网站优化公司价格1、备忘录模式
备忘录模式#xff08;Memento Pattern#xff09;保存一个对象的某个状态#xff0c;以便在适当的时候恢复对象#xff0c;备忘录模式属于行为型模式。
备忘录模式允许在不破坏封装性的前提下#xff0c;捕获和恢复对象的内部状态。 实现方式
创建备忘录…1、备忘录模式
备忘录模式Memento Pattern保存一个对象的某个状态以便在适当的时候恢复对象备忘录模式属于行为型模式。
备忘录模式允许在不破坏封装性的前提下捕获和恢复对象的内部状态。 实现方式
创建备忘录类用于存储和封装对象的状态。创建发起人角色负责创建备忘录并根据需要恢复状态。创建备忘录管理类可选负责管理所有备忘录对象。
2、观察者模式
观察者模式是一种行为型设计模式它定义了一种一对多的依赖关系当一个对象的状态发生改变时其所有依赖者都会收到通知并自动更新。
当对象间存在一对多关系时则使用观察者模式Observer Pattern。比如当一个对象被修改时则会自动通知依赖它的对象。观察者模式属于行为型模式。
观察者模式解决的是一个对象状态改变时如何自动通知其他依赖对象的问题同时保持对象间的低耦合和高协作性。
2.1、实现方式
定义观察者接口包含一个更新方法。创建具体观察者实现观察者接口定义接收到通知时的行为。定义主题接口包含添加、删除和通知观察者的方法。创建具体主题实现主题接口管理观察者列表并在状态改变时通知它们。
2.2、应用实例
拍卖系统拍卖师作为主题竞价者作为观察者拍卖价格更新时通知所有竞价者。
2.3、优点
抽象耦合观察者和主题之间是抽象耦合的。触发机制建立了一套状态改变时的触发和通知机制。
2.4、缺点
性能问题如果观察者众多通知过程可能耗时。循环依赖可能导致循环调用和系统崩溃。缺乏变化详情观察者不知道主题如何变化只知道变化发生。
2.4、使用建议
在需要降低对象间耦合度并且对象状态变化需要触发其他对象变化时使用。 考虑使用Java内置的观察者模式支持类如java.util.Observable和java.util.Observer。
2.5、注意事项
避免循环引用注意观察者和主题之间的依赖关系避免循环引用。 异步执行考虑使用异步通知避免单点故障导致整个系统卡壳。
2.6、实现
观察者模式使用三个类 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: 10103、状态模式
在状态模式State Pattern中类的行为是基于它的状态改变的这种类型的设计模式属于行为型模式。
在状态模式中我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
状态模式允许对象在内部状态改变时改变其行为使得对象在不同的状态下有不同的行为表现。通过将每个状态封装成独立的类可以避免使用大量的条件语句来实现状态切换。
3.1、使用场景
当代码中存在大量条件语句且这些条件语句依赖于对象的状态时。
3.2、使用建议
当对象的行为随状态改变而变化时考虑使用状态模式。 状态模式适用于替代复杂的条件或分支语句。
3.3、注意事项
状态模式适用于状态数量有限通常不超过5个的情况。 谨慎使用以避免系统变得过于复杂。
4、空对象模式
在空对象模式Null Object Pattern中一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类还创建一个未对该类做任何实现的空对象类该空对象类将无缝地使用在需要检查空值的地方。
使用一个空对象代替 null 值这个空对象实现了相同的接口但对请求不做任何操作或提供默认操作。
5、策略模式
在策略模式Strategy Pattern中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式定义了一系列算法或策略并将每个算法封装在独立的类中使得它们可以互相替换。通过使用策略模式可以在运行时根据需要选择不同的算法而不需要修改客户端代码。
在策略模式中我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
将每个算法封装起来使它们可以互换使用。
5.1、应用实例
锦囊妙计每个锦囊代表一个策略包含不同的计策。旅行方式选择骑自行车、坐汽车等每种方式都是一个可替换的策略。Java AWT的LayoutManager不同的布局管理器实现了相同的接口但提供了不同的布局算法。
5.2、优点
算法切换自由可以在运行时根据需要切换算法。避免多重条件判断消除了复杂的条件语句。扩展性好新增算法只需新增一个策略类无需修改现有代码。
5.3、缺点
策略类数量增多每增加一个算法就需要增加一个策略类。所有策略类都需要暴露策略类需要对外公开以便可以被选择和使用。
如果系统中策略类数量过多考虑使用其他模式或设计技巧来解决类膨胀问题。
6、模板模式
在模板模式Template Pattern中一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
在父类中定义了算法的骨架并允许子类在不改变算法结构的前提下重定义算法的某些特定步骤。
6.1、实现方式
定义抽象父类包含模板方法和一些抽象方法或具体方法。 实现子类继承抽象父类并实现抽象方法不改变算法结构。
6.2、优点
封装不变部分算法的不变部分被封装在父类中。扩展可变部分子类可以扩展或修改算法的可变部分。提取公共代码减少代码重复便于维护。
为了防止恶意修改模板方法通常使用final关键字修饰避免被子类重写。
6.3、实现
我们将创建一个定义操作的 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!7、访问者模式
在访问者模式Visitor Pattern中我们使用了一个访问者类它改变了元素类的执行算法。通过这种方式元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式元素对象已接受访问者对象这样访问者对象就可以处理元素对象上的操作。
旨在将数据结构与在该数据结构上执行的操作分离从而使得添加新的操作变得更容易而无需修改数据结构本身。
使用场景 当需要对一个对象结构中的对象执行多种不同的且不相关的操作时尤其是这些操作需要避免污染对象类本身。 实现方式 定义访问者接口声明一系列访问方法一个访问方法对应数据结构中的一个元素类。 创建具体访问者实现访问者接口为每个访问方法提供具体实现。 定义元素接口声明一个接受访问者的方法。 创建具体元素实现元素接口每个具体元素类对应数据结构中的一个具体对象