观察者模式,状态模式(例子)

合集下载

常见设计模式及应用场景

常见设计模式及应用场景

常见设计模式及应用场景设计模式是一种解决特定问题的经验总结,可以提高代码的可重用性、可读性和灵活性。

在软件开发过程中,常见的设计模式有23种,下面将对其中的几种常见的设计模式及其应用场景进行介绍。

1. 单例模式(Singleton Pattern):单例模式用于限制一个类只能有一个实例,并提供一个全局访问点。

在需要频繁创建和销毁对象的场景下,可以使用单例模式来减少系统开销。

例如,在多线程环境下需要共享某个资源时,通过单例模式可以保证该资源只有一个实例。

2. 工厂模式(Factory Pattern):工厂模式用于创建对象,把实例化对象的过程封装在一个工厂类中。

它解耦了对象的创建和使用,提高了代码的可扩展性。

例如,一个电商平台上有多种类型的商品,可以通过工厂模式根据用户的选择来创建相应类型的商品。

3. 观察者模式(Observer Pattern):观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。

观察者模式适用于对象之间存在一种一对多的关系,并且对象之间需要保持一致。

例如,一个新闻发布系统中,当发布一条新闻时,系统需要通知所有订阅该新闻频道的用户。

4. 策略模式(Strategy Pattern):策略模式定义了一系列可以互相替换的算法,并根据具体情况选择合适的算法。

使用策略模式可以避免使用大量的if-else语句,提高代码的可维护性和扩展性。

例如,在一个电商平台中,根据会员等级的不同,可以采用不同的折扣策略来计算商品的价格。

5. 适配器模式(Adapter Pattern):适配器模式用于将两个不兼容的接口转换为可兼容的接口,使得不同的类可以协同工作。

适配器模式可以增强代码的复用性和灵活性。

例如,一个音频播放器只支持mp3格式的音乐文件,当我们需要播放其他格式的音乐文件时,可以使用适配器模式将不同格式的音乐文件转换为mp3格式。

6. 建造者模式(Builder Pattern):建造者模式可以将创建复杂对象的过程与表示分离,使得同样的创建过程可以创建不同的表示。

java最常用的六种设计模式及举例

java最常用的六种设计模式及举例

java最常用的六种设计模式及举例设计模式是在软件开发过程中经验总结的一种编码和设计方式,它们可以帮助我们更好地组织代码,提高代码的可维护性和可复用性。

下面是 Java 中最常用的六种设计模式及其举例:1. 单例模式:单例模式确保一个类只有一个实例,并提供一个全局访问点。

典型的例子是 `ng.Runtime` 类,在整个 JVM 中只有一个运行时实例。

2. 工厂模式:工厂模式通过一个工厂类来创建其他类的对象,将对象的创建和使用分离,降低了代码的耦合度。

比如,`java.util.Calendar` 类使用了工厂模式来创建 `Calendar` 对象,其中的 `getInstance()` 方法返回一个 `Calendar` 实例。

3. 观察者模式:观察者模式定义了对象之间的一对多的依赖关系,当一个对象状态发生改变时,其相关依赖对象会收到通知并自动更新。

一个典型的例子是使用 `java.util.Observable` 类和 `java.util.Observer`接口进行监听和通知。

4. 装饰者模式:装饰者模式通过动态地将新功能附加到对象上,为对象提供了灵活的扩展方式,不需要修改原始对象的结构。

比如,`java.io` 包中的各种装饰者类可以用来扩展输入输出功能。

5. 策略模式:策略模式定义了一组算法,并将每个算法封装到可互换的对象中,使得算法的变化不会影响到使用算法的客户端。

一个常见的例子是使用 `parator` 接口来实现不同的比较策略。

6. 适配器模式:适配器模式将一个类的接口转换成客户端所期望的另一个接口,使得原本不兼容的类可以一起工作。

比如,`java.util.Arrays` 类中的 `asList()` 方法返回的是一个适配器,可以将数组转换成 List。

通过学习这些设计模式,我们可以更好地组织和设计代码,提高代码的可读性和可维护性。

在实际的开发中,我们可以针对具体的需求选择合适的设计模式,并根据需要进行一定的修改和定制。

设计模式在游戏设计中的应用案例分析

设计模式在游戏设计中的应用案例分析

设计模式在游戏设计中的应用案例分析随着游戏行业的不断发展,游戏设计的要求也越来越高。

游戏的需求复杂,而且需要高度的可重用性和可扩展性。

因此,设计模式的应用在游戏设计中变得越来越重要。

它们为游戏设计师提供了一些可重用的解决方案来解决游戏设计中的常见问题。

然而,设计模式并非万能的,需要根据不同的场景选择不同的模式进行应用。

在本篇文章中,我们将会分析设计模式在游戏设计中的应用案例。

1. 单例模式单例模式是一种创建型模式,它被用来保证一个类只有一个实例,并且提供一个全局访问点。

在游戏设计中,单例模式经常用来管理游戏中的全局资源,如关卡资源、音效资源等。

使用单例模式可以避免过多的资源加载导致的内存浪费,同时也可以提高游戏的性能表现。

下面是一个单例模式在游戏场景中的示例代码:```// ResourceManager 单例类public class ResourceManager {private static ResourceManager instance = null; private ResourceManager() {}public static ResourceManager getInstance() { if (instance == null) {instance = new ResourceManager();}return instance;}public void loadLevel(String levelName) {// 加载场景资源}public void loadSound(String soundName) { // 加载音效资源}}// 游戏场景public class GameScene {public void loadResources() {ResourceManager resMgr = ResourceManager.getInstance();resMgr.loadLevel("scene1");resMgr.loadSound("bg_music");}}```在上述代码中,通过ResourceManager.getInstance()方法获取单例对象,在GameScene场景中使用ResourceManager来加载资源,使得场景资源和音效资源的加载和管理变得简单和高效。

观察者模式的例子

观察者模式的例子

观察者模式的例子
观察者模式的例子
观察者模式是一个十分常见的设计模式,它可以帮助我们从被观察的
对象中获取信息,并在需要时自动通知我们。

本篇文章将通过几个具
体的例子来介绍观察者模式。

一、新闻订阅
假设我们有一个新闻网站,用户可以选择订阅自己感兴趣的新闻主题,如政治、体育、娱乐等。

当我们有新的相关新闻时,应该如何通知已
订阅该主题的用户呢?这时观察者模式就可以充分发挥作用。

我们可
以把网站的用户看作观察者,而每个订阅主题可以看作一个被观察者,当被观察者发生变化时(如新闻更新),通知所有观察者即可。

二、股票市场
另一个例子是股票市场,投资者需要及时了解股票的价格变化。

我们
可以把每只股票看作一个被观察者,而每个投资者可以看作观察者。

当股票价格发生变化时,被观察者可以通过观察者模式通知所有观察者,投资者们就可以第一时间了解到相关信息。

三、自定义通知
观察者模式还可以用于自定义通知,例如某个人可以设置自己的日程
安排,并让自己的亲属和朋友作为观察者,当日程安排发生变化时,
观察者将自动收到通知,以便及时作出应对。

总结
观察者模式可以用于任何需要监控变化的场景,它将被观察者和观察
者解耦,使得系统更加灵活和可扩展。

在实际应用中,我们需要关注
以下几点:
1. 确定被观察者和观察者之间的关系,并定义相应的接口;
2. 当被观察者状态发生变化时,通知所有观察者;
3. 观察者根据通知的内容作出相应的处理。

观察者模式虽然简单,但是在系统的设计和开发中发挥着重要的作用。

希望读者们能够多加关注和实践!。

观察者模式的应用场景

观察者模式的应用场景

观察者模式的应用场景观察者模式是一种设计模式,用于实现对象之间的一对多依赖关系。

在该模式中,一个对象(subject)维护了一个观察者列表,当subject的状态发生变化时,它会自动通知所有观察者,使它们能够做出相应的响应。

观察者模式可以帮助我们实现松耦合的设计,提高代码的复用性和可维护性。

下面我们将介绍观察者模式的几个常见应用场景。

一、图形界面组件观察者模式在图形用户界面(GUI)的设计中被广泛应用。

例如,在一个窗口中,可以有多个按钮,当按钮被点击时,窗口会触发相应的事件。

这些按钮就是观察者,窗口是被观察者。

当按钮被点击时,窗口会通知所有的按钮,并且每个按钮都可以根据需要进行响应,例如执行一段特定的代码。

通过观察者模式,可以实现图形界面组件之间的解耦,使得它们可以独立地进行开发和维护。

二、消息订阅与发布观察者模式也可以用于消息订阅与发布的场景。

在这种场景下,可以有多个消息的订阅者(观察者),当有新的消息发布时,订阅者会收到通知并进行相应的处理。

这种模式可以应用于各种场景,例如新闻订阅、实时数据监控等。

通过观察者模式,发布者和订阅者之间的耦合度得到了降低,方便了系统的扩展和维护。

三、事件处理在事件驱动的程序设计中,观察者模式也经常被用于事件的处理。

事件可以是用户的操作,例如鼠标点击、键盘输入等,也可以是系统的通知,例如网络连接成功、文件加载完成等。

当事件发生时,被观察者会通知所有的观察者,并且每个观察者可以根据自身的需要做出相应的处理。

这种模式使得事件的处理变得灵活而可扩展,方便了程序的开发和维护。

四、数据监控与同步观察者模式还可以用于数据监控与同步的场景。

例如,在一个分布式系统中,可以有多个节点,每个节点都有自己的状态。

当任何一个节点的状态发生变化时,需要通知其他的节点进行同步。

这时,可以使用观察者模式,将每个节点作为观察者,当任何一个节点的状态发生变化时,它会通知其他的节点进行相应的更新操作。

PHP常用的五种设计模式及应用场景

PHP常用的五种设计模式及应用场景

PHP常⽤的五种设计模式及应⽤场景设计模式六⼤原则开放封闭原则:⼀个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

⾥⽒替换原则:所有引⽤基类的地⽅必须能透明地使⽤其⼦类的对象.依赖倒置原则:⾼层模块不应该依赖低层模块,⼆者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

单⼀职责原则:不要存在多于⼀个导致类变更的原因。

通俗的说,即⼀个类只负责⼀项职责。

接⼝隔离原则:客户端不应该依赖它不需要的接⼝;⼀个类对另⼀个类的依赖应该建⽴在最⼩的接⼝上。

迪⽶特法则:⼀个对象应该对其他对象保持最少的了解。

1.单例设计模式所谓单例模式,即在应⽤程序中最多只有该类的⼀个实例存在,⼀旦创建,就会⼀直存在于内存中!单例设计模式常应⽤于数据库类设计,采⽤单例模式,只连接⼀次数据库,防⽌打开多个数据库连接。

⼀个单例类应具备以下特点:单例类不能直接实例化创建,⽽是只能由类本⾝实例化。

因此,要获得这样的限制效果,构造函数必须标记为private,从⽽防⽌类被实例化。

需要⼀个私有静态成员变量来保存类实例和公开⼀个能访问到实例的公开静态⽅法。

在PHP中,为了防⽌他⼈对单例类实例克隆,通常还为其提供⼀个空的私有__clone()⽅法。

使⽤场景:只实例化⼀次,内部实例化,对外只有⼀个开放⽅法,只能通过调取该⽅法进⾏调取实例化对象。

数据库连接单例模式的例⼦:<?php/*** Singleton of Database*/class Database{// We need a static private variable to store a Database instance.private static $instance;// Mark as private to prevent it from being instanced.private function__construct(){// Do nothing.}private function__clone(){// Do nothing.}public static function getInstance(){if (!(self::$instance instanceof self)) {self::$instance = new self();}return self::$instance;}}$a = Database::getInstance();$b = Database::getInstance();// truevar_dump($a === $b);2.⼯⼚设计模式⼯⼚模式是另⼀种⾮常常⽤的模式,正如其名字所⽰:确实是对象实例的⽣产⼯⼚。

安卓常用的6种设计模式总结

安卓常用的6种设计模式总结

安卓常⽤的6种设计模式总结最近看到两篇博客,觉得很不错,记录⼀下由于项⽬变更的频繁性,作为⼀名程序员,我们需要掌握设计模式的必要性,就不⾔⽽喻~~,下⾯就是⼀些我⾃⼰学习的设计模式总结。

接下来,主要是针对⼏个⽐较常⽤模式进⾏讲解,主要是以下⼏种:观察者模式适配器模式代理模式⼯⼚模式单例模式命令模式1.观察者模式(Observer Pattern)释义:观察者模式定义了⼀种⼀对多的依赖关系,让多个观察者对象同时监听某⼀个主题对象,这个主题对象在状态上发⽣变化时,会通知所有观察者对象,使他们能够⾃动更新⾃⼰。

故事理解:观察者想知道公司所有MM的情况,只要加⼊公司的MM情报邮件组就⾏了,tom负责搜集情报,当发现新情报时,不⽤⼀个⼀个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦。

常见实例:1.BaseAdapter.registerDataSetObserver和BaseAdapter.unregisterDataSetObserver两⽅法来向BaseAdater注册、注销⼀个DataSetObserver ; 2.使⽤ContentObserver去监听数据库变化。

适⽤场景:1.当对⼀个对象的改变需要同时改变其他对象,⽽不知道具体有多少对象有待改变;2.当⼀个对象必须通知其它对象,⽽它⼜不能假定其它对象是谁.观察者模式主要有观察者和被观察者2个对象,在该模式中,Observable表⽰被观察者,这个对象是⼀个抽象类,只能被继承。

Observer表⽰观察者,他是⼀个接⼝,所以观察者可以有多个,实现了该接⼝的类都是属于观察者。

这是⽹上⼀个⽣动细致的demo:被观察者:public class MyPerson extends Observable {private int age;private String name;private String sax;public int getAge() {return age;}public void setAge(int age) {this.age = age;setChanged();notifyObservers();}public String getName() {return name;}public void setName(String name) { = name;setChanged();notifyObservers();}public String getSax() {return sax;}public void setSax(String sax) {this.sax = sax;}@Overridepublic String toString() {return "MyPerson [age=" + age + ", name=" + name + ", sax=" + sax + "]";}}MyPerson是被观察者,类中调⽤了setChange()以及notifyObservers()两个⽅法,前者是告知数据改变,后者是发送信号通知观察者。

Observer(观察者模式)

Observer(观察者模式)
观察者模式
观察者模式介绍
在系统的设计中,我们常常需要设计一个消息提示功能,让系统把 提示信息发送到客户端。做到这一点的设计方案可以是多种多样, 但是为了使系统能够易于复用,我们的设计应该遵守高内聚低耦合 的设计原则,而且减少对象之间的耦合有利于系统的复用。观察者 模式(Observer)是满足这一要求的各种设计方案中最重要的一种。 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态 发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
角色:观察者角色和被观察角色。
例子:想买房的人就是观察者(HousePriceObserver),要成为观察 者就要实现Observer接口,房子是被观察者(House),要成为被 观察者就要继承Observable类。房价一旦发生改变,就应该通过某 种方式通知购房者房价的变更。
观察者模式适用性 适用性: 1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。 将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2.当对一个对象的改变需要同时改变其它对象, 而不知道具体有 多少对象有待改变。
3.当一个对象必须通知其它对象,而它又不能假定其它对象是 谁。换言之, 你不希望这些对象是紧密耦合的。 4. awt,swing,swt中的监听器对象。
总结
观察者模式(Observer)的优点是实现了抽象与具体的分离,并定 义了稳定的更新消息传递机制,类别清晰,并抽象了更新接口。 观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者 角色所知道的只是一个具体现察者聚集,每一个具体现察者都符合一 个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只 知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦 合在一起,因此它们可以属于不同的抽象化层次
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

public class XiaoMing { public static void main(String[] args) { IBoy qiang=new Qiang(); IBoy cai =new Cai(); SnowWhite sw=new SnowWhite(); sw.Add(qiang); sw.Add(cai); sw.state ="吃饭"; sw.Notify(); }
public interface IPrincess { void Add(IBoy b); void Remove(IBoy b); void Notify(); public class SnowWhite implements IPrincess { String state; ArrayList<IBoy> boys=new ArrayList<IBoy>(); @Override public void Add(IBoy b) { boys.add(b); } @Override public void Remove(IBoy b) { boys.remove(b); } @Override public void Notify() { for(IBoy b:boys){ b.Update(); } }
}Leabharlann 态模式• P201 • State • 意图 • 允许一个对象在其内部改变时改变它的行 为,对象看起来似乎修改了它的类 • 若一个对象有多种状态,则将它的状态封 装成对象,需要的时候,在对象间进行变 换。
例子
• 打游戏的幸福状态
Normal
Mad

例子
• • • • • • • • 有一个美丽的善良的姑娘 很多的追求者 追求者队伍会不断的变换 追求者最喜欢问的话“你在干嘛” 善良的姑娘不断的回复 困惑 姑娘:不断回复给很多人 追求者:不断询问
解决
• 用关注的方式 • 如果boy关注了女孩,则可以通过数据绑定 方法获得女孩的状态列表。 • 女孩会更新自己的状态
public interface IBoy { void Update(); }
public class Qiang implements IBoy { @Override public void Update() { System.out.println("小强说状态已更改"); }
public class Cai implements IBoy { @Override public void Update() { System.out.println("状态已更改--Cai"); }
练习
• 订阅新闻 • 有个新闻自动发布系统,用户可以订阅或 取消订阅该系统,当该系统有新内容时, 会通知给订阅它的用户。 • 订阅用户可以通过update方法,获得新闻 更新。 • 画类图,写完整代码
public interface INews { void Add(IUser u); void Remove(IUser u); void Notify(); } public interface IUser { void Update(); } public class Seven implements IUser { @Override public void Update() { System.out.println("我的新闻列表已更新---Seven"); } }
public class News implements INews { public String title,contex; ArrayList<IUser> myUsers=new ArrayList<IUser>(); @Override public void Add(IUser u) { myUsers.add(u); } @Override public void Remove(IUser u) { myUsers.remove(u); } @Override public void Notify() { for(IUser u:myUsers){ u.Update(); } }
public class XiaoMing {
public static void main(String[] args) { IUser seven =new Seven(); News news=new News(); news.Add(seven); news.title="新标题"; news.contex="新内容"; news.Notify(); }
相关文档
最新文档