23种设计模式uml图及java简单实现代码
23种设计模式详解ppt课件

眼睛是心灵的窗户,是人体中最宝贵 的感觉 器官, 可很多 孩子对 眼睛的 重要性 不重视 。在每 学期的 视力测 查中情 况都不 容乐观
设计模式分类
Creational patterns 帮助我们更好地组织创建 对象的代码。增强弹性,以应付在不同情况下 创建和初始化对象的代码变更。 Structural patterns 增强代码重用,优化对象结 构,使其职责分明、粒度合适,以松耦合的体 系结构来减低代码的rippling效应。 Behavioral patterns 更好地定义对象间的协作 关系,使复杂的程序流程变得清晰。
由上述我们不难引出Abstract Factory的定义,就是 用于创建Factory的Factory。其设计思想和Factory的完 全一致,不过是一种特殊的Factory而已。
眼睛是心灵的窗户,是人体中最宝贵 的感觉 器官, 可很多 孩子对 眼睛的 重要性 不重视 。在每 学期的 视力测 查中情 况都不 容乐观
实际上,EJB容器将所有资源(JMS Factory、EJB Home等)的Factory全绑定到了目录服务中,使用这 些Factory的时候都是由目录服务获取,因此目录服务 是所有资源Factory的Abstract Factory。
眼睛是心灵的窗户,是人体中最宝贵 的感觉 器官, 可很多 孩子对 眼睛的 重要性 不重视 。在每 学期的 视力测 查中情 况都不 容乐观
其核心思想是将可重用的解决方案总 结出来,并分门别类。从而指导设计,减 少代码重复和优化体系结构。
眼睛是心灵的窗户,是人体中最宝贵 的感觉 器官, 可很多 孩子对 眼睛的 重要性 不重视 。在每 学期的 视力测 查中情 况都不 容乐观
采用设计模式的益处
重用,避免代码重复冗余 优化体系结构 提升系统的可维护性和弹性 代码更加容易测试,利于测试驱动 为性能优化提供便利 使软件质量更加有保证 增强代码可读性,便于团队交流 有助于整体提升团队水平
UML科普文,一篇文章掌握14种UML图

UML科普⽂,⼀篇⽂章掌握14种UML图前⾔上⼀篇⽂章写了⼀篇建造者模式,其中有⼏个UML类图,有的读者反馈看不懂了,我们今天就来解决⼀哈。
什么是UML?UML是Unified Model Language的缩写,中⽂是统⼀建模语⾔,是由⼀整套图表组成的标准化建模语⾔。
为什么要⽤UML?通过使⽤UML使得在软件开发之前,对整个软件设计有更好的可读性,可理解性,从⽽降低开发风险。
同时,也能⽅便各个开发⼈员之间的交流。
UML提供了极富表达能⼒的建模语⾔,可以让软件开发过程中的不同⼈员分别得到⾃⼰感兴趣的信息。
Page-Jones 在《Fundamental Object-Oriented Design in UML》⼀书中总结了UML的主要⽬的,如下:1. 为⽤户提供现成的、有表现⼒的可视化建模语⾔,以便他们开发和交换有意义的模型。
2. 为核⼼概念提供可扩展性 (Extensibility) 和特殊化 (Specialization) 机制。
3. 独⽴于特定的编程语⾔和开发过程。
4. 为了解建模语⾔提供⼀个正式的基础。
5. ⿎励⾯向对象⼯具市场的发展。
6. ⽀持更⾼层次的开发概念,如协作,框架,模式和组件。
7. 整合最佳的⼯作⽅法 (Best Practices)。
UML图有哪些?UML图分为结构图和⾏为图。
结构图分为类图、轮廓图、组件图、组合结构图、对象图、部署图、包图。
⾏为图⼜分活动图、⽤例图、状态机图和交互图。
交互图⼜分为序列图、时序图、通讯图、交互概览图。
UML图概览什么是类图?【概念】类图是⼀切⾯向对象⽅法的核⼼建模⼯具。
类图描述了系统中对象的类型以及它们之间存在的各种静态关系。
【⽬的】⽤来表⽰类、接⼝以及它们之间的静态结构和关系。
在类图中,常见的有以下⼏种关系。
泛化(Generalization)【泛化关系】是⼀种继承关系,表⽰⼦类继承⽗类的所有特征和⾏为。
【箭头指向】带三⾓箭头的实线,箭头指向⽗类。
软件设计模式(Java版)

8.3.1模式的定义与特点 8.3.2模式的结构与实现 8.3.3模式的应用实例 8.3.4模式的应用场景 8.3.5模式的扩展
8.4.1模式的定义与特点 8.4.2模式的结构与实现 8.4.3模式的应用实例 8.4.4模式的应用场景 8.4.5模式的扩展
9.1 UMLet的 1
使用与类图的 设计
1.3.1开闭原则 1.3.2里氏替换原则 1.3.3依赖倒置原则 1.3.4单一职责原则 1.3.5接口隔离原则 1.3.6迪米特法则 1.3.7合成复用原则 1.3.8 7种设计原则的要点
2.2单例模式
2.1创建型模式概 述
2.3原型模式
2.4本章小结
2.5习题
2.2.1模式的定义与特点 2.2.2模式的结构与实现 2.2.3模式的应用实例 2.2.4模式的应用场景 2.2.5模式的扩展
9.3.1实验目的 9.3.2实验原理 9.3.3实验内容 9.3.4实验要求 9.3.5实验步骤
9.4.1实验目的 9.4.2实验原理 9.4.3实验内容 9.4.4实验要求 9.4.5实验步骤
作者介绍
这是《软件设计模式(Java版)》的读书笔记模板,暂无该书作者的介绍。
读书笔记
这是《软件设计模式(Java版)》的读书笔记模板,可以替换为自己的心得。
目录分析
1
1.1软件设计 模式概述
2
1.2 UML中的 类图
3
1.3面向对象 的设计原则
4
1.4本章小结
5
1.5习题
1.1.1软件设计模式的产生背景 1.1.2软件设计模式的概念与意义 1.1.3软件设计模式的基本要素 1.1.4 GoF的23种设计模式简介
1.2.1统一建模语言简介 1.2.2类、接口和类图 1.2.3类之间的关系
面向对象设计的23个设计模式详解

面向对象设计的23个设计模式详解面向对象设计是一种广泛应用于软件开发的思想,其核心在于将数据和操作封装在一起形成对象,并通过各种方式进行交互和组合,从而实现复杂的功能。
在这一过程中,设计模式起到了非常重要的作用,可以有效地提高代码的可读性、可维护性和可扩展性。
本文将对23种常见的设计模式进行详解。
一、创建型模式1.简单工厂模式简单工厂模式属于创建型模式,其目的是提供一个工厂类,使得创建对象的过程更加简单。
在这种模式中,使用者只需要提供所需对象的参数,而无需关心对象的具体实现细节。
简单工厂模式适合于对象创建过程较为简单的情况。
2.工厂方法模式工厂方法模式是简单工厂模式的进一步扩展,其核心在于将工厂类进行接口抽象化,使得不同的工厂类可以创建不同的对象实例。
工厂方法模式适合于对象创建过程较为复杂的情况。
它可以为工厂类添加新的产品类型,而不会影响原有的代码。
3.抽象工厂模式抽象工厂模式是工厂方法模式的进一步扩展,其目的是提供一个可以创建一系列相关或者独立的对象的接口。
在抽象工厂模式中,使用者只需要关心所需对象组合的类型,而无需关注对象的具体实现过程。
4.建造者模式建造者模式也是一种创建型模式,其目的在于将复杂对象分解为多个简单的部分,并将其组装起来形成复杂对象实例。
在建造者模式中,使用者只需要关注所需对象以及它们的组合方式,而无需关心对象的具体实现过程。
5.原型模式原型模式是一种基于克隆的创建型模式,其核心在于通过复制现有的对象实例来创建新的对象。
在原型模式中,对象实例的创建过程与对象所包含的状态密切相关。
原型模式适合于创建复杂对象实例,且这些对象实例之间是相对独立的情况。
二、结构型模式6.适配器模式适配器模式是一种结构型模式,其目的在于将一个类的接口转换为另一个类所能使用的接口。
在适配器模式中,使用者可以通过不同的适配器实现对象之间的互相调用。
7.桥接模式桥接模式是一种结构型模式,其目的在于将抽象部分与实现部分相互分离,从而使得两者可以独立变化。
03.设计模式.UML类图

UML(Unified Modeling Language,统一建模语言)。
武汉科技大学
UML简介
UML的诞生
1997年11月,在Ivar Jacoboson、Grady Booch以及James Rumbaugh的共同努力下,UML1.1版本提交给OMG (Object Management Group, 对象管理组织)并获得通 过,UML1.1成为业界标准的建模语言。
Ivar Jacobson博士曾任瑞典爱立信公司的首席软 件体系架构师,负责迄今为止商业上最为成功 的AXE交换机的研发。
Байду номын сангаас
Jacobson《面向对象软件工程》和《UML 语言 用户指南》等著作,已经成为殿堂级的软件经 典著作。
武汉科技大学
UML简介
UML的诞生
从1994年起,Grady Booch和James Rumbaugh在Rational 软件公司开始了UML的创建工作。 1995年,OOSE方法和Objectory方法的创建者Ivar Jacobson也加入其中。 UML三位创始人正式联手,共同为创建一种标准的建 模语言而一起工作,他们将开发出来的产品名称定为
UML简介
武汉科技大学
UML简介
UML“三剑客”
UML是面向对象领域的三位著名的方法学家 Grady Booch,James Rumbaugh(詹姆斯-朗博) 和Ivar Jacobson (伊万· 雅各布森)共同提出的。
Grady Booch
James Rumbaugh
都拥有有影响力的发言权。截至到2010-12-30,OMG拥
有379个会员组织。
武汉科技大学
13种uml简介、工具及示例

13种uml简介、工具及示例UML(Unified Modeling Language)是一种用于软件开发的标准化建模语言,它使用图形表示法来描述软件系统的不同方面。
在软件开发过程中,使用UML可以帮助开发人员更清晰地理解系统的结构和行为,从而更好地进行设计和实现。
UML提供了包括结构模型、行为模型和交互模型在内的多种建模方式,其中每种模型都有各自的符号和语法规则。
通过使用这些模型,开发人员可以将系统分解成不同的部分,然后逐步细化这些部分的设计,以便更好地组织和管理项目。
在UML中,最常用的建模元素包括用例图、类图、时序图、活动图、状态图等。
每种图表都有其特定的用途和表达能力,开发人员可以根据实际需要选择合适的图表进行建模。
除了建模元素外,UML还定义了一系列的建模工具,这些工具可以帮助开发人员更高效地进行建模和分析。
其中一些常用的建模工具包括Enterprise Architect、Rational Rose、StarUML等。
下面将对13种UML简介、工具及示例进行详细介绍:1. 用例图(Use Case Diagram)用例图是UML中描述系统功能和用户交互的基本图表之一。
它用椭圆表示用例,用直线连接用例和参与者,展示了系统外部用户和系统之间的交互。
用例图可以帮助开发人员更清晰地理解系统的功能需求,从而指导系统的设计和实现。
示例:一个简单的在线购物系统的用例图包括用例“浏览商品”、“添加商品到购物车”、“提交订单”等,以及参与者“顾客”和“管理员”。
2. 类图(Class Diagram)类图是UML中描述系统结构和静态关系的基本图表之一。
它用矩形表示类,用线连接类之间的关系,包括关联关系、聚合关系、继承关系等。
类图可以帮助开发人员更清晰地理解系统的对象结构和类之间的关系,从而支持系统的设计和重构。
示例:一个简单的学生信息管理系统的类图包括类“学生”、“课程”、“教师”等,以及它们之间的关系如“选修”、“授课”等。
2.设计模式常用的UML图分析(用例图、类图与时序图)

2.设计模式常⽤的UML图分析(⽤例图、类图与时序图)1-⽤例图概述1. 展现了⼀组⽤例、参与者以及他们之间的关系。
2. ⽤例图从⽤户⾓度描述系统的静态使⽤情况,⽤于建⽴需求模型。
⽤例特征保证⽤例能够正确捕捉功能性需求,判断⽤例是否准确的依据。
1. ⽤例是动宾短语2. ⽤例是相互独⽴的3. ⽤例是由⽤户参与者启动的4. ⽤例要有可观测的执⾏结果5. ⼀个⽤例是⼀个单元参与者 ActorUML中,参与者使⽤⼀个⼩⼈表⽰:1. 参与者为系统外部与系统直接交互的⼈或事务,于系统外部与系统发⽣交互作⽤2. 参与者是⾓⾊⽽不是具体的⼈3. 代表参与者在与系统打交道时所扮演的⾓⾊4. 系统实际运作中,⼀个实际⽤户可能对应系统的多个参与者。
不同⾓⾊也可以只对应⼀个参与者,从⽽代表同⼀参与者的不通实例⽤例 Use Case系统外部可见的⼀个系统功能单元。
系统的功能由系统单元所提供,并通过⼀系列系统单元与⼀个或多个参与者之间交换的消息所表达。
系统单元⽤椭圆表⽰,椭圆中的⽂字简述系统功能:关系 Relationship常见关系类型有关联、泛化、包含和扩展关联 Association表⽰参与者与⽤例之间的通信,任何⼀⽅都可发送或接受消息。
箭头指向:指向消息接收⽅:⼦系统 SubSystem⽤来展⽰系统的⼀部分功能(紧密联系)泛化 Inheritance继承关系,⼦⽤例和⽗⽤例相似,但表现出更特别的⾏为;⼦⽤例将继承⽗⽤例的所有结构、⾏为和关系。
⼦⽤例可以使⽤⽗⽤例的⼀段⾏为,也可以重载它。
⽗⽤例通常是抽象。
箭头指向:指向⽗⽤例2-类图描述系统中的类,以及各个类之间的关系的静态试图。
表⽰类、接⼝以及它们之间的协作关系,⽤于程序设计阶段。
注意:1. 抽象类或抽象⽅法⽤斜体表⽰2. 如果是接⼝,则在类名上⽅加 <<Interface>>3. 字段和⽅法返回值的数据类型⾮必需4. 静态类或静态⽅法加下划线类图实例:类图中的事务及解释如图,类图从上到下分为三部分,分别为类名、属性和操作1. 属性:如果有属性,则每⼀个属性都必须有⼀个名字,另外还可以有其它的描述信息,如可见性、数据类型、缺省值等2. 操作:如果有操作,则每⼀个操作也都有⼀个名字,其它可选的信息包括可见性、参数的名字、参数类型、参数缺省值和操作的返回值的类型等类图中的六种关系1.实现关系 implements (类实现接⼝)⽤空⼼三⾓虚线表⽰2.泛化关系 extends (表⽰⼀般与特殊的关系) is-a⽤空⼼三⾓实线表⽰3.组合关系 (整体与部分的关系) contains-a实⼼菱形实现表⽰eg.有头类、⾝体类与⼈类类三个类,则⼈类类中应包含头类及⾝体类这两个属性,则⼈类类与头类和⾝体的关系即为组合关系。
23种设计模式范文

23种设计模式范文设计模式是软件开发中常用的解决方案模式,它们代表了在面对特定问题时的最佳实践和经验总结。
设计模式可以帮助我们更好地组织和设计代码,提高代码的可读性、可维护性和可扩展性。
在本文中,我们将介绍23种常用的设计模式,并分别讨论它们的实现原理和在实际开发中的应用场景。
1. 单例模式(Singleton Pattern)单例模式是最简单的设计模式之一,它确保一个类只有一个实例,并提供一个全局访问点。
在实现上,可以通过将构造函数私有化,然后提供一个静态方法返回实例来实现单例。
应用场景:在需要实现全局唯一访问点的场景下,比如线程池、配置管理器等。
2. 工厂模式(Factory Pattern)工厂模式是用来创建对象的一种模式,它将对象的创建和实现分离,使得代码更易于维护和扩展。
工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式等几种不同的变体。
应用场景:在需要根据不同条件创建不同对象的场景下,比如数据库连接、日志记录等。
3. 抽象工厂模式(Abstract Factory Pattern)抽象工厂模式是工厂模式的一种扩展,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定实际的类。
抽象工厂模式将一组工厂类封装起来,使其可以交换或者替换。
应用场景:在需要创建一组相关对象(如界面主题、操作系统等)并且需要保持一致性的场景下。
4. 建造者模式(Builder Pattern)建造者模式是用来生成复杂对象的一种模式,它将对象的构建与其表现分离,采用逐步构建的方式生成对象,可以让客户端不需要知道具体的构建细节。
应用场景:在构造过程比较复杂,需要多个组件协同工作的场景下,比如构建复杂的UI界面。
5. 原型模式(Prototype Pattern)原型模式是用来克隆对象的一种模式,它通过复制已有对象的原型来创建新的对象,避免了通过构造函数创建对象和初始化成员变量的重复过程。
应用场景:在需要创建大量相似对象或者初始化成本较高的对象时,可以使用原型模式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
23种经典设计模式UML类图汇总关键字: 设计模式23种设计模式JAVA代码实现和追mm和设计模式关键字: 23种设计模式java代码实现追mm和设计模式最讨厌废话了,把代码贴出来最简单。
package lq.test;import java.io.*;import java.util.*;//*********创建型模式***************//factory method 1//1具体的构造算法,和2构造出的具体产品由子类实现interface Product {}//或者我也提供一个工厂的接口,由这个抽象类来继承它abstract class Factory {abstract public Product fmd();//我认为这个方方法的存在是,是对FactoryMethod方法的补充//例如可以为生成的对象赋值,计算为生成对象应付何值,前后的日值//且这些都是公用的,生成产品的最主要算法还是在FactoryMethod中,//这个方法只是起辅助作用,这也是一种思维方法,将具体的算法实现在一个方法中//而我不直接调用此方法,而使用另外的一个方法封装它,等到了更灵活的效果,而//子类需实现的内容是FactoryMethod//此方法是一个TemplateMethodpublic Product creat() {Product pd = null;System.out.println("before operation");pd = fmd();System.out.println("end operation");return pd;}}class Product1 implements Product {}class Factory1 extends Factory {public Product fmd() {Product pd = new Product1();return pd;}}//FactroyMethod 2//这种方式简单实用interface Producta {}interface Factorya {Producta create();}class Producta1 implements Producta {}class Factorya1 implements Factorya {public Producta create() {Producta pda = null;pda = new Producta1();return pda;}}//AbstractFactory//AbstractFactory与FactoryMethod的不同在于AbstractFactory创建多个产品//感觉此模式没有什么大用//当然可以还有更多的接口interface Apda {}interface Apdb {}interface Afactory {Apda createA();Apdb createB();}class Apda1 implements Apda {}class Apdb1 implements Apdb {}//有几个接口就有几个对应的方法class Afactory1 implements Afactory {public Apda createA() {Apda apda = null;apda = new Apda1();return apda;}public Apdb createB() {Apdb apdb = null;apdb = new Apdb1();return apdb;}}//Builder//一个产品的生成分为生成部件和组装部件,不同的产品每个部件生成的方式不同//而组装的方式相同,部件的生成抽象成接口方法,而组装的方法使用一个TemplateMethod方法interface Cpda {}class Cpda1 implements Cpda {}interface BuilderI {void buildPart1();void buildPart2();void initPd();Cpda getPd();}abstract class BuilderA implements BuilderI {Cpda cpda;public Cpda getPd() {initPd();//对对象的内容进行设置buildPart1();buildPart2();return cpda;}}class Builder extends BuilderA {public void buildPart1() {System.out.println(cpda);}public void buildPart2() {System.out.println(cpda);}public void initPd() {cpda = new Cpda1();}}//一个简单的生成产品的实现//1abstract class Fy {public abstract void med1();static class Fy1 extends Fy {public void med1() {}}public static Fy getInstance() {Fy fy = new Fy1();return fy;// Fy fy = new Fy1() {//这种匿名内部类是静态的!!// public void med1() {// }// };// return fy;}}//2interface Pdd {}class Pdd1 implements Pdd {}abstract class Fya {public static Pdd getPd() {Pdd pdd = new Pdd1();return pdd;}}//Prototype 在java中就是clone,又包含深拷贝和浅拷贝class CloneObja {public CloneObja MyClone() {return new CloneObja();}}class CloneObjb {public CloneObjb MyClone() throws Throwable {CloneObjb cobj = null;cobj = (CloneObjb) pcl(this);return cobj;}//深度拷贝算法private Object pcl(Object obj) throws Throwabl e {ByteArrayOutputStream bao = new ByteArrayOutputStr eam(1000);ObjectOutputStream objo = new ObjectOutputStream(b ao);objo.writeObject(obj);ByteArrayInputStream bai = new ByteArrayInputStrea m(bao.toByteArray());ObjectInputStream obji = new ObjectInputStream(bai );Object objr = obji.readObject();return objr;}}//Singleton//一个类只有一个对象,例如一个线程池,一个cacheclass Singleton1 {public static Singleton1 instance = new Si ngleton1();private Singleton1() {}public static Singleton1 getInstance() {return instance;}}class Singleton2 {public static Singleton2 instance;private Singleton2() {}// public static Singleton2 getInstance() {// if (instance == null) {// instance = new Singleton2();// }//// return instance;// }public static Singleton2 getInstance() {synchronized(Singleton2.class) {if (instance == null) {instance = new Singleton2();}}return instance;}}//**********结构型模式**********//Adapter//基本方法有两种,一种是使用引用一种使用继承//将不符合标准的接口转成符合标准的接口,接口的修改主要是参数的增减,//返回值类型,当然还有方法名//感觉这就是封装的另一种表示形式,封装有用方法封装(在方法中调用功能方法),//用类封装(先传入功能方法所在的类的对象,通过调用此对象的功能方法)//使用引用的形式class Adapteea {public void kk() {}}interface Targeta {String vv(int i, int k);}class Adaptera implements Targeta{Adapteea ade;public Adaptera(Adapteea ade) {this.ade = ade;}public String vv(int i, int k) {//具体的业务方法实现在Adaptee中,这个方法//只起到了接口转换的作用//调用此方法是通过引用ade.kk();return null;}}//使用继承形式的class Adapteeb {public void kk() {}}interface Targetb {String vv(int i, int k);}class Adapterb extends Adapteeb implements Targetb {public String vv(int i, int k) { //调用此方法是通过继承kk();return null;}}//Proxyinterface Subject {void request();}class realSubject implements Subject { public void request() {//do the real business}}class Proxy implements Subject {Subject subject;public Proxy(Subject subject) {this.subject = subject;}public void request() {System.out.println("do something");subject.request();System.out.println("do something");}}//Bridge//感觉就是多态的实现interface Imp {void operation();}class Cimp1 implements Imp {public void operation() {System.out.println("1");}}class Cimp2 implements Imp {public void operation() {System.out.println("2");}}class Invoker {Imp imp = new Cimp1();public void invoke() {imp.operation();}}//Compositeinterface Component {void operation();void add(Component component);void remove(Component component);}class Leaf implements Component {public void operation() {System.out.println("an operation");}public void add(Component component) {throw new UnsupportedOperationException();}public void remove(Component component) { throw new UnsupportedOperationException();}}class Composite implements Component {List components = new ArrayList();public void operation() {Component component = null;Iterator it = components.iterator();while (it.hasNext()) {//不知道此component对象是leaf还是composite,//如果是leaf则直接实现操作,如果是composite则继续递归调用component = (Component) it.next();component.operation();}}public void add(Component component) {components.add(component);}public void remove(Component component) {components.remove(component);}}//Decorator//对一个类的功能进行扩展时,我可以使用继承,但是不够灵活,所以选用了//另外的一种形式,引用与继承都可活得对对象的一定的使用能力,而使用引用将更灵活//我们要保证是对原功能的追加而不是修改,否则只能重写方法,或使用新的方法//注意concrete的可以直接new出来,//而decorator的则需要用一个另外的decorator对象才能生成对象//使用对象封装,和公用接口//Decorator链上可以有多个元素interface Componenta {void operation();}class ConcreteComponent implements Componenta {public void operation() {System.out.println("do something");}}class Decorator implements Componenta { private Componenta component;public Decorator(Componenta component) {ponent = component;}public void operation() {//do something beforecomponent.operation();//do something after}}//Facade//非常实用的一种设计模式,我可以为外部提供感兴趣的接口class Obj1 {public void ope1() {}public void ope2() {}}class Obj2 {public void ope1() {}public void ope2() {}}class Facade {//我得到了一个简洁清晰的接口public void fdMethod() {Obj1 obj1 = new Obj1();Obj2 obj2 = new Obj2();obj1.ope1();obj2.ope2();}}//Flyweight//空//**********行为型模式*************//Chain of Responsibility//与Decorator的实现形式相类似,//Decorator是在原来的方法之上进行添加功能,而//Chain则是判断信号如果不是当前处理的则转交个下一个节点处理//我可以使用if分支来实现相同的效果,但是不够灵活,链上的每个节点是可以替换增加的,相对//比较灵活,我们可以设计接口实现对节点的增删操作,而实现更方便的效果//这个是一个链状的结构,有没有想过使用环状结构interface Handler {void handRequest(int signal);}class CHandler1 implements Handler {private Handler handler;public CHandler1(Handler handler) {this.handler = handler;}public void handRequest(int signal) {if (signal == 1) {System.out.println("handle signal 1");}else {handler.handRequest(signal);}}}class CHandler2 implements Handler {private Handler handler;public CHandler2(Handler handler) {this.handler = handler;}public void handRequest(int signal) {if (signal == 2) {System.out.println("handle signal 2");}else {handler.handRequest(signal);}}}class CHandler3 implements Handler {public void handRequest(int signal) {if (signal == 3) {System.out.println("handle signal 3");}else {throw new Error("can't handle signal");}}}class ChainClient {public static void main(String[] args) { Handler h3 = new CHandler3();Handler h2 = new CHandler2(h3);Handler h1 = new CHandler1(h2);h1.handRequest(2);}}//Interpreter//感觉跟Composite很类似,只不过他分文终结符和非终结符//Template Methodabstract class TemplateMethod {abstract void amd1();abstract void amd2();//此方法为一个Template Method方法public void tmd() {amd1();amd2();}}//State//标准型//状态和操作不应该耦合在一起class Contexta {private State st;public Contexta(int nst) {changeStfromNum(nst);}public void changeStfromNum(int nst) {if (nst == 1) {st = new CStatea1();}else if (nst == 2) {st = new CStatea2();}throw new Error("bad state");}void request() {st.handle(this);}}interface State {void handle(Contexta context);}class CStatea1 implements State {public void handle(Contexta context) {System.out.println("state 1");//也许在一个状态的处理过程中要改变状态,例如打开之后立即关闭这种效果//context.changeStfromNum(2);}}class CStatea2 implements State {public void handle(Contexta context) {System.out.println("state 2");}}//工厂型//根据状态不通生成不同的state//class StateFactory {//public static State getStateInstance(int num) {// State st = null;//// if (num == 1) {// st = new CStatea1();// }// else if (num == 2) {// st = new CStatea2();// }//// return st;// }//}//Strategy//跟Bridge相类似,就是一种多态的表示//Visitor//双向引用,使用另外的一个类调用自己的方法,访问自己的数据结构interface Visitor {void visitElement(Elementd element);}class CVisitor implements Visitor {public void visitElement(Elementd element) {element.operation();}}interface Elementd {void accept(Visitor visitor);void operation();}class CElementd implements Elementd { public void accept(Visitor visitor) { visitor.visitElement(this);}public void operation() {//实际的操作在这里}}class Clientd {public static void main() {Elementd elm = new CElementd();Visitor vis = new CVisitor();vis.visitElement(elm);}}//Iteraotr//使用迭代器对一个类的数据结构进行顺序迭代interface Structure {interface Iteratora {void first();boolean hasElement();Object next();}}class Structure1 implements Structure { Object[] objs = new Object[100];//使用内部类是为了对Struture1的数据结构有完全的访问权 class Iteratora1 implements Iteratora { int index = 0;public void first() {index = 0;}public boolean hasElement() {return index < 100;}public Object next() {Object obj = null;if (hasElement()) {obj = objs[index];index++;}return obj;}}}//Meditorclass A1 {public void operation1() {}public void operation2() {}}class A2 {public void operation1() {}public void operation2() {}}class Mediator {A1 a1;A2 a2;public Mediator(A1 a1, A2 a2) { this.a1 = a1;this.a2 = a2;}//如果我想实现这个功能我可能会把他放在A1中//但是这样耦合大,我不想在A1中出现A2对象的引用, //所以我使用了Mediator作为中介public void mmed1() {a1.operation1();a2.operation2();}public void mmed2() {a2.operation1();a1.operation2();}}//Command//我认为就是将方法转换成了类class Receiver {public void action1() {}public void action2() {}}interface Command {void Execute();}class CCommand1 implements Command { private Receiver receiver;public CCommand1(Receiver receiver) {this.receiver = receiver;}public void Execute() {receiver.action1();}}class CCommand2 implements Command { private Receiver receiver;public CCommand2(Receiver receiver) {this.receiver = receiver;}public void Execute() {receiver.action2();}//Observer//在这里看似乎这个模式没有什么用//但是如果我有一个线程监控Subject,如果Subject的状态//发生了变化,则更改Observer的状态,并出发一些操作,这样就有实际的意义了//Observer与Visitor有相似的地方,都存在双向引用//Subject可以注册很多Observerinterface Subjectb {void attach(Observer observer);void detach(Observer observer);void mynotify();int getState();void setState(int state);}class Subjectb1 implements Subjectb {List observers = new ArrayList();int state;public void attach(Observer observer) {observers.add(observer);}public void detach(Observer observer) {observers.remove(observer);}public void mynotify() {Observer observer = null;Iterator it = observers.iterator();while (it.hasNext()) {observer = (Observer) it.next();observer.Update();}}public int getState() {return state;}public void setState(int state) {this.state = state;}}interface Observer {void Update();}class Observer1 implements Observer { Subjectb subject;int state;public Observer1(Subjectb subject) {this.subject = subject;}public void Update() {this.state = subject.getState();}public void operation() {//一些基于state的操作}}//Memento//感觉此模式没有什么大用class Memento {int state;public int getState() {return state;}public void setState(int state) {this.state = state;}}class Originator {int state;public void setMemento(Memento memento) {state = memento.getState();}public Memento createMemento() {Memento memento = new Memento();memento.setState(1);return memento;}public int getState() {return state;}public void setState(int state) {this.state = state;}}class careTaker {Memento memento;public void saverMemento(Memento memento) {this.memento = memento;}public Memento retrieveMemento() {return memento;}}//程序最终还是顺序执行的,是由不通部分的操作拼接起来的//将不同类的代码拼接起来是通过引用实现的,有了引用我就//相当于有了一定访问数据结构和方法的能力,这与写在类内部//差不多,例如我想将一个类中的一个方法抽离出去,因为这个方法依赖与此类的数据和其他方法//直接将代码移走是不行的,但如果我们拥有了此类对象的引用,则与写在此类//内部无异,所以我们拥有了引用就可以将此方法移出。