23种设计模式uml图及java简单实现代码
- 格式:doc
- 大小:1.60 MB
- 文档页数:31
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)【泛化关系】是⼀种继承关系,表⽰⼦类继承⽗类的所有特征和⾏为。
【箭头指向】带三⾓箭头的实线,箭头指向⽗类。
面向对象设计的23个设计模式详解面向对象设计是一种广泛应用于软件开发的思想,其核心在于将数据和操作封装在一起形成对象,并通过各种方式进行交互和组合,从而实现复杂的功能。
在这一过程中,设计模式起到了非常重要的作用,可以有效地提高代码的可读性、可维护性和可扩展性。
本文将对23种常见的设计模式进行详解。
一、创建型模式1.简单工厂模式简单工厂模式属于创建型模式,其目的是提供一个工厂类,使得创建对象的过程更加简单。
在这种模式中,使用者只需要提供所需对象的参数,而无需关心对象的具体实现细节。
简单工厂模式适合于对象创建过程较为简单的情况。
2.工厂方法模式工厂方法模式是简单工厂模式的进一步扩展,其核心在于将工厂类进行接口抽象化,使得不同的工厂类可以创建不同的对象实例。
工厂方法模式适合于对象创建过程较为复杂的情况。
它可以为工厂类添加新的产品类型,而不会影响原有的代码。
3.抽象工厂模式抽象工厂模式是工厂方法模式的进一步扩展,其目的是提供一个可以创建一系列相关或者独立的对象的接口。
在抽象工厂模式中,使用者只需要关心所需对象组合的类型,而无需关注对象的具体实现过程。
4.建造者模式建造者模式也是一种创建型模式,其目的在于将复杂对象分解为多个简单的部分,并将其组装起来形成复杂对象实例。
在建造者模式中,使用者只需要关注所需对象以及它们的组合方式,而无需关心对象的具体实现过程。
5.原型模式原型模式是一种基于克隆的创建型模式,其核心在于通过复制现有的对象实例来创建新的对象。
在原型模式中,对象实例的创建过程与对象所包含的状态密切相关。
原型模式适合于创建复杂对象实例,且这些对象实例之间是相对独立的情况。
二、结构型模式6.适配器模式适配器模式是一种结构型模式,其目的在于将一个类的接口转换为另一个类所能使用的接口。
在适配器模式中,使用者可以通过不同的适配器实现对象之间的互相调用。
7.桥接模式桥接模式是一种结构型模式,其目的在于将抽象部分与实现部分相互分离,从而使得两者可以独立变化。
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图分析(⽤例图、类图与时序图)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种常用的设计模式,并分别讨论它们的实现原理和在实际开发中的应用场景。
1. 单例模式(Singleton Pattern)单例模式是最简单的设计模式之一,它确保一个类只有一个实例,并提供一个全局访问点。
在实现上,可以通过将构造函数私有化,然后提供一个静态方法返回实例来实现单例。
应用场景:在需要实现全局唯一访问点的场景下,比如线程池、配置管理器等。
2. 工厂模式(Factory Pattern)工厂模式是用来创建对象的一种模式,它将对象的创建和实现分离,使得代码更易于维护和扩展。
工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式等几种不同的变体。
应用场景:在需要根据不同条件创建不同对象的场景下,比如数据库连接、日志记录等。
3. 抽象工厂模式(Abstract Factory Pattern)抽象工厂模式是工厂模式的一种扩展,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定实际的类。
抽象工厂模式将一组工厂类封装起来,使其可以交换或者替换。
应用场景:在需要创建一组相关对象(如界面主题、操作系统等)并且需要保持一致性的场景下。
4. 建造者模式(Builder Pattern)建造者模式是用来生成复杂对象的一种模式,它将对象的构建与其表现分离,采用逐步构建的方式生成对象,可以让客户端不需要知道具体的构建细节。
应用场景:在构造过程比较复杂,需要多个组件协同工作的场景下,比如构建复杂的UI界面。
5. 原型模式(Prototype Pattern)原型模式是用来克隆对象的一种模式,它通过复制已有对象的原型来创建新的对象,避免了通过构造函数创建对象和初始化成员变量的重复过程。
应用场景:在需要创建大量相似对象或者初始化成本较高的对象时,可以使用原型模式。
Java中常⽤的设计模式23种JAVA设计模式项⽬实战教程java数据结构算法Java中常⽤的设计模式 23种JAVA设计模式项⽬实战教程java数据结构算法58套Java⾼级架构师视频教程,微服务,⾼并发,分布式,⾼可⽤,⾼性能,集群架构,设计模式,数据结构,中间件,并发编程,虚拟机,⾼可扩展,服务器,数据库,性能调优,负载均衡,安全架构,全⽂检索,权限管理Spring Boot,Spring Cloud⼤型分布式综合电商项⽬实战等视频教程JAVA⾼级架构师技术包含:JAVA架构设计,系统架构,缓存架构,分布式架构,安全架构,微服务,⾼并发,⾼可⽤,⾼可扩展,⾼性能,集群搭建,设计模式,数据结构,中间件,并发编程,JVM虚拟机,性能调优,负载均衡,单点登录,⽇志分析,全⽂检索,任务调度,权限管理,⼯作流,⽹络编程,脚本编程,分布式事务,分库分表,团队协作,持续集成,⾃动化部署,服务器,数据库,图形数据库,项⽬实战,SSM框架,SpringBoot,SpringCloud,Maven,Mybatis,Docker,K8S,Devops,Jenkins,Elasticsearch,Nginx,Tomcat,RabbitMQ,RocketMQ,ActiveMQ,Kafka,Dubbo,Solr,SSO,CAS,OA,Ehcache,Memcached,Activiti,Quartz,Shiro ,Git,Netty ,NIO,Linux,Shell,IDEA,Spring,Springmvc,SpringSecurity,SpringData,VueJS,RectJS,AngularJS,NodeJS,Hadoop,Hbase,Spark,HttpClient,Json,Nosql,Mysql,Redis,MongoDB,Zookeeper,Mycat,Oracle,健康项⽬实战,秒杀系统实战,电商项⽬实战,在线教育实战,P2P⾦融项⽬实战,⼤型分布式综合电商项⽬实战等视频教程......58套精品教程介绍:1、58套精品是掌柜最近整理出的最新教程,都是当下最⽕的技术,最⽕的课程,也是全⽹教程的精品;2、58套资源包含:全套完整⾼清视频、完整源码、配套⽂档;3、知识也是需要投资的,有投⼊才会有产出(保证投⼊产出⽐是⼏百上千倍),如果有⼼的朋友会发现,⾝边投资知识的⼤都是技术经理或者项⽬经理,⼯资⼀般相对于不投资的也要⾼出很多;总⽬录:58套JAVA⾼级架构师,微服务架构,亿级⾼并发,分布式架构,源码剖析系列,项⽬实战,设计模式实战,数据结构与算法,消息中间件,并发编程多线程,服务器系列,数据库,分布式事务,⼤型分布式综合电商项⽬实战视频教程第⼀套:01.【⾼并发课】亿级⾼并发⼤型电商详情页系统的⾼性能与⾼可⽤缓存架构实战视频教程第⼆套:02.【微服务课】微服务架构实战160讲.8⼤核⼼模块精讲.打通架构师进阶之路视频教程第三套:03.【项⽬实战】微服务电商系统从设计到实现全流程讲解基于SpringCloud视频教程第四套:04.【项⽬实战】微服务架构⼴告设计系统实战基于SpringCloud+Kafka+Mysql视频教程第五套:【项⽬实战】精讲SpringBoot2.0互联⽹⾦融理财项⽬实战,开发实战与原理分析视频教程(3套)第01套【主流框架】SpringBoot2.0全新系列精通到实战史上最全的完整版视频教程第02套【主流框架】Spring Boot实战与原理分析视频课程第03套【主流框架】SpringBoot2.0互联⽹⾦融理财系统综合项⽬实战视频课程第六套:06.【微服务课】精通SpringBoot Cloud微服务框架,实战案例与源码剖析视频教程(2套)第01套.Spring Cloud微服务最新技术⼊门到精通视频教程第02套.精通Spring Boot Cloud使⽤并理解框架的原理与底层运作机制视频教程第七套:07.【源码解析】深度剖析Spring Spring5 Mybatis Tomcat源码系列底层框架解析视频教程第⼋套:08.【项⽬实战】微服务容器化综合实践Docker+Kubernetes践⾏DevOps理念 k8s部署落地(3套)第01套:Docker+Kubernetes(k8s)微服务容器化及多技术综合实践视频教程第02套:深⼊系统学习Docker容器技术,实践DevOps理念视频教程第03套:Kubernetes(k8s)落地全程实践企业级应⽤实践从部署到核⼼应⽤视频教程第九套:09.【项⽬实战】从⽆到有搭建中⼩型互联⽹公司后台服务架构与运维架构视频课程第⼗套:10.【设计模式】精讲Java23种设计模式源码分析+内存分析+编程思想+Debug⽅式视频教程第⼗⼀套:11.【项⽬实战】设计模式综合项⽬(实战)设计模式综合应⽤的实战案例视频教程第⼗⼆套:12.【项⽬实战】软件系统功能设计(实战)训练(6个设计案例)视频教程第⼗三套:13.【数据结构】恋上数据结构与算法,程序员修炼编程内功(数组,栈,队列,链表,递归,排序,堆等)第⼗四套:14.【⾼级进阶】深度解析Spring5新特性,Java8~11新特性原理与实践,⾼级进阶实战视频教程第01套:Java8新特性原理,⾼级进阶实战视频教程第02套:Java9、10、11新特性全套精讲视频教程第03套:深⼊浅出spring原理与实践视频课程第04套:Spring5新特性及应⽤举例精讲剖析视频教程第⼗五套:15.【项⽬实战】快速上⼿SSO单点登录开发与项⽬实战单点登录在集群开发的作⽤视频教程(2套)第01套【单点登录】SSO单点登录快速上⼿与项⽬实战视频教程第02套【单点登录】SSO单点登录开发与实战,单点登录在集群开发的作⽤视频教程第⼗六套:16.【⾼级架构】Java架构之消息中间件Kafka RabbitMQ RocketMQ ActiveMq精通实战(4套)01.【中间件】ActiveMq中间件基础到精通⾼级实战视频课程02.【中间件】JAVA-ACE架构师系列课程 Rocketmq03.【中间件】RabbitMQ中间件基础到精通,消息订阅视频课程04.【中间件】Kafka分布式消息中间节原理剖析及实战演练视频课程第⼗七套:17.【项⽬实战】企业⽇志平台⽣产案例实战,⽇志分析之ELK stack实战视频教程第⼗⼋套:18.【⾼级进阶】顶尖⾼⼿系列Elasticsearch快速上⼿篇+⾼⼿进阶篇视频课程第⼗九套:19.【项⽬实战】基于Activiti6.X⼯作流进阶与项⽬实战,Activiti整合Drools视频课程第⼆⼗套:20.【任务调度】Spring+Quartz的分布式任务调度及源码解析视频课程第⼆⼗⼀套:21.【系统学习】Java架构之Shiro权限管理权限设计实现项⽬案例,与Springboot整合教程(3套)第01套.SpringBoot与Shiro整合-权限管理实战视频第02套.Shiro基础到精通,原理与架构视频课程第03套.Apache Shiro权限框架实战+项⽬案例+权限设计实现视频课程第⼆⼗⼆套:22.【系统学习】深⼊学习Zookeeper分布式系统开发实战视频课程第⼆⼗三套:23.【分布式】Dubbo第三⽅⽀付项⽬的系统架构实战视频教程第⼆⼗四套:24.【微服务】基于⽀付系统场景的微服务架构的分布式事务解决⽅案视频课程第⼆⼗五套:25.【项⽬实战】实战技能Linux100讲全⽅位实战讲解视频教程第⼆⼗六套:26.【linux精讲】Shell脚本编程⼤量企业级实例带你全⾯掌握六⼤技术点视频教程第⼆⼗七套:27.【⾼级进阶】⾼并发多线程实训营-Java多线程编程三个阶进阶实战视频教程第⼆⼗⼋套:28.【⾼级架构】架构之⾼并发系统架构实战⽅案 Java⾼并发解决⽅案与并发编程教程第⼆⼗九套:29.【⾼级进阶】深⼊Java并发编程原理与实战线程安全+锁原理+同步容器+实战讲解视频教程第三⼗套:30.【分布式】分布式事务框架Myth+Raincat+Tcc源码解析视频教程第三⼗⼀套:31.【分布式】分布式常见问题解决⽅案,分布式事务与锁,缓存实战解决⽅案视频教程第三⼗⼆套:32.【分布式】解决分布式事务数据⼀致性开发与实践分布式事务实现视频教程第三⼗三套:33.【分布式】分布式集群部署实战,分布式存储缓存协调调度视频教程第三⼗四套:34.【性能优化】深⼊JAVA虚拟机,JVM内核-原理,诊断与优化+内存模型+虚拟机原理视频教程第三⼗五套:35.【性能优化】架构⼤⽜带你学习MySql,Nginx,Tomcat,JVM性能调优系列专题视频教程第三⼗六套:36.【性能优化】深⼊JAVA程序性能调优视频(阿姆达尔定律、缓存组件、并⾏开发、线程池、JVM调优)第三⼗七套:37.【⾼级进阶】全⾯深⼊Mysql数据库系统优化+查询优化,Mysql⼤型分布式集群,从⼩⽩到⼤神(3套)第01套:全⾯深⼊Mysql数据库优化查询优化mysql⾼级第02套【数据库】MySQL⾼级⼤型分布式集群,主从复制,负载均衡,数据库中间件视频课程第03套:Mysql从⼩⽩到⼤神视频教程第三⼗⼋套:38.【⾼级进阶】深⼊进阶Oracle DBA性能优化+⾼可⽤+海量数据库设计视频课程(2套)第三⼗九套:39.【项⽬实战】企业级开发与运维Redis从⼊门到项⽬实战视频教程第四⼗套:40.【项⽬实战】精通MongoDB4.0从⼊门到实践,掌握NoSQL数据库企业主流解决⽅案视频教程第四⼗⼀套:41.【⾼级架构】Java架构之Mycat实现mysql⾼可⽤集群,分布库分表中间件视频教程第四⼗⼆套:42.【数据库】图形数据库之王 Neo4j从⼊门到精通视频教程第四⼗三套:43.【⾼级进阶】企业级Nginx核⼼知识,百万并发下的Nginx性能优化之道视频教程。
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;}}//程序最终还是顺序执行的,是由不通部分的操作拼接起来的//将不同类的代码拼接起来是通过引用实现的,有了引用我就//相当于有了一定访问数据结构和方法的能力,这与写在类内部//差不多,例如我想将一个类中的一个方法抽离出去,因为这个方法依赖与此类的数据和其他方法//直接将代码移走是不行的,但如果我们拥有了此类对象的引用,则与写在此类//内部无异,所以我们拥有了引用就可以将此方法移出。