Java设计模式

软件设计的 开-闭原则:

开闭原则是:一个系统要对扩展开放,而对修改关闭。这里的所指的意思就是在不修改以前已经写好的代码或者尽量不改的情况下来扩展系统的功能。
由于从抽象层导出一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的,这就满足了开闭原则的第一条。
在语言里,可以给出一个或多个抽象类或者接口,规定出所有的具体类必须提供的方法的特征作为系统设计的抽象层。这个抽象层预见了所有的可扩展性,因此,在任何扩展情况下都不会改变。这就使得系统的抽象不需要修改,从而满足了开闭原则的第二条,对修改关闭。

Design pattern 分类

(1)、创建型,一般通过用来创建对象 Factory Method Pattern、Builder Pattern、Prototype Pattern、Singleton Pattern.

(2)、结构型,对象组合来获取更大的结构 Adapter Pattern、 Proxy Pattern、 Facade Pattern、Bridge Pattern、Decorator Pattern。

(3)、行为模型,处理对象如何交互 Observer Pattern、 Template Pattern、 Strategy Pattern、 State Pattern、 Command Pattern、 Iterator Pattern。

一:单态模式(Single Pattern)

      注意:构造函数可见性为private。这样使得外面的类不能通过引言来产生对象。

      构造器(Constructor)声明为private的话,外面不能实例化,典型的单例模式和一些工具类(提供静态方法),都把构造器声明为private。所以要得到这个类的实例只能是类名。method()取的它实例。
     

 

     线程安全的Singleton

      

为什么需要使用Singleton:单态模式是保证一个类有且仅有一个对象实例。单态模式经常使用在控制资源的访问上。例如配置文件管理类、数据工具类或Socket连接等。单态模式可以控制在某个时刻只有一个线程访问资源。

二:工厂模式(Factory Pattern)

    (a):简单工厂模式(Simple Factory Pattern)

        

  简单工厂模式符合设计开闭原则的第一个原则,对扩展开发,但不符合第二个原则,如果再增加一个产品,则在工厂里增加相应的业务逻辑和判断逻辑。

 

改进版,通过类的反射机制来实现

    

    (b):工厂方法模式(Abstract Factory Pattern):当添加一个操作时,需要修改静态工厂方法不符合开闭原则(对扩展开放,对修改封闭)。把工厂里的静态工厂方法由不同的工厂子类来分担。

 

    

 

       

 

三 建造模型(Builder Pattern)

           客户首先创建一个指导者对象和一个建造者角色,并将建造者角色传入指导者对象进行配置。然后,指导者按照步骤调用建造者的方法创建产品。最后客户从建造者或指导者那里得到产品。建造模式将复杂对象的组件和表示方式封装在一个具体的建造角色中,而由指导者来协调建造者角色来得到具体的产品实例。

类图:

     

 

 四 适配器模式(Adapter pattern)

   将一个类的接口转换为客户希望的另一个类的接口

 A接口使用了方法1来实现某个功能,B接口使用了方法2来实现某个功能。修改任何一个接口中的方法都要修改其实现和使用到的地方。此模式是为了在面向接口编程中更好的复用。

 

形状接口定义了它所对应的绘制图形所有的基本方法,现在要绘制椭圆,庆幸自己发现系统中已经有了绘制图形的实现。但是发现Shape接口中定义的方法和TextCircle中定义的方法不一样。

 

看在Circle中如何实现

  

五  桥接模式(bridge pattern)

桥梁模式主要的手段用动态的聚合关系,代替为静态的继承关系,从而达到系统的重构,使系统具有更高的复用.用意是将问题的抽象和实现分离开来实现,通过用聚合代替继承来解决子类爆炸性增长的问题。

当系统有两个可变因素时 我就应该考虑到桥梁模式,至少它应该在你的脑子里闪过

 

 如 形状接口中,可能还会增加一个形状,画法可能除了画法一还有画法二,这就要要考虑bridge pattern

1:找出变化并且封装

2:优先考虑聚合而不是继承

eg:  

抽象形状(抽象角色 形状)

  

仔细体会了一下桥梁模式,感觉凡是‘调用和实现’之间的问题都可以用桥梁模式解决。

 

六 组合模型 (composite)

    Composite模式的一个重要思想是递归组合,关键是一个抽象类,它既可以代表组合对象,又可以代表一个被组合的对象。经常在Java开发中遇到的容器就使用了组合模式,一方面组件可以放在容器中,另一方面容器也可以作为组件放在另外的容器中。 

 

 

  removeComponent(Component com) com 可以是Component类的子类对象也可以是它本身。

 

 七 装饰模式(decorator Pattern 或 包装器模式Wrapper Pattern)

应用:Java 的I/O API就是使用Decorator实现的 ,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐。如:

FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);

      定义:动态给一个对象添加一些额外的职责。这些功能需要由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能。使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的.

eg:

      

八 门面模式(facade Pattern)

          又叫外观模式 ,为子系统中的一组接口提供一个一致的界面。

门面模式的门面类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与子系统内部的很多对象打交道。 一个典型应用就是进行数据库连接。一般我们在每一次对数据库进行访问,都要进行以下操作:先得到 connect 实例,然后打开 connect 获得连接,得到一个 statement ,执行 sql 语句进行查询,得到查询结果集。

  

 

 

 eg:

  

九 代理模式(proxy Pattern)

定义:为其它对象提供一种代理以控制这个对象的访问,一般客户不想直接或者不能引用某一个对象。而代理则可以在客户和目标对象之间起到中间作用。proxy 可以控制原对象,但不能修改原对象。代理类必须和原来的接口(目标类)是一样的。

eg:把要进行安全性检查的一个方法模块化,写在类里。当我们生产了代理对象的时候,如果调用代理方法的时候,会自动默认调用invoke方法。这个模块化的类就是所谓的切面(Aspect),安全性检查就是advice。

 

   

十 享元模式(FlyWeight Pattern)

享元模式属于结构型模式,其意图是运用共享技术有效地支持大量细粒度的对象。

 FlyweightFactory(Object obj):创建并管理Flyweight对象。确保合理的共享Flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已经创建的实例或者创建一个。比如:String类的字符串池,每次创建一个新的字符串对象都会去字符串池里去找有没有这个对象,如果没有创建一个新的,如果共享原来的对象。

 

  

十一 责任链模式

       责任链模式用于弱化请求发生者和请求处理者之间的关系。当多个对象都可以对请求进行处理,但不同的对象能处理的请求类型不同时,可以通过指向另一个对象的引用把这些对象连成一条责任链。当 Client 发出一个请求时,并不知道具体由哪个对象进行处理,它看到的只是一条责任链,将请求直接交给责任链,请求会在责任链中传递,直到找到一个能够进行处理的对象或者遍历结束找不到一个能够处理的对象为止。

 

 

eg: 不同角色的人员能够处理的 Request 的级别不同,Manager 只能处理一般的 Request,Director 具有更高的权限,能够审批更高级别的 Request,CEO 能处理的 Request 级别还要高些。

抽象类:

 

十二 访问者模式

   在不修改已有程序的前提下,通过添加额外的"访问者"来完成对已有代码的提升。
定义:表示作用于某一结构对象的各个元素的操作。它可以使你在不修改各个元素类的情况下定义作用于这些元素的新的操作。

十三 状态模式

输入信号是事件;输出是状态结果,状态模式状态机就是一个黑盒子。
状态模式主要突出了两个字:”改变”,对象的状态决定了状态的行为,事物的本质决定了事物的行为。
对一个状态特别重要的对象,通过状态机来建模一个对象的状态;
状态模式处理的核心问题是状态的迁移,因为在对象存在很多状态情况下,
对各个business flow,各个状态之间跳转和迁移过程都是及其复杂的。
例如一个工作流,审批一个文件,存在新建、提交、已修改。
HR部门审批中、老板审批中、HR审批失败、老板审批失败等状态,涉及多个角色交互,涉及很多事件,
这种情况下用状态模式(状态机)来建模更加合适;
把各个状态和相应的实现步骤封装成一组简单的继承自一个接口或抽象类的类,
通过另外的一个Context来操作他们之间的自动状态变换,通过event来自动实现各个状态之间的跳转
参与者:      
  Context(环境,Person)定义客户感兴趣的类。
  State(Moodstate):定义一个接口以封装与Context的一个特定状态相关的行为
  ConcreteState Subclasses(具体状态子类,如Angry)每一个子类实现一个与Context的状态相关的行为。
他们的协作关系是:
  Context将于状态相关的请求委托给当前的ConcreteState对象处理。
  Context可将自身作为一个参数传递给处理该请求的状态对象,这使得状态对象在必要的时候可访问Context。
  Context是客户使用的主要接口,客户可用状态对象来配置一个Context,一旦一个Context配置完毕,他的客户不再需要直接与状态对象打交道。
  Context或者ConcreteState子类都可以决定哪个状态是另外那个状态的后继者,以及是在何种条件下进行状态转换。

十四 观察者模式

  定义对象之间的一种一对多的关系,当一个对象的状态改变时, 所有依赖它的对象都会被通知并且自动更新.
1, 观察者(具体执行操作的对象,有多个)
2, 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操作)
参照 java.util.Observable java.util.Observer

下面以一个例子来讲解观察者模式
一监控系统,需要根据系统某些变化报警,报警方式有Email、短信等多种,
IAlarm是报警接口。(观察者)当我们的系统需要添加报警方式的时候只需实现IAlarm的Warn方法即可。Email类是EmailAlarm报警的实现,SMSAlarm类是短信报警的实现。
MonitorContainer是监视器(抽象类)相当于被观察者。只负责通知变化,当子类调用Notify方法它即会通知报警模块报警,如Email和SMS(短信)。
NetMonitor是其中的具体的监控模块,继承于MonitorContainer。当发现系统网络有问题时会调用父类的Notify方法。

 

十五 备忘录模式

      其意图是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将对象恢复到原先保存的状态。
备忘录实际上有两个接口,
“备忘录管理者角色”只能看到备忘录提供的窄接口——对于备忘录角色中存放的属性是不可见的。不能对备忘录的属性操作或检查
“备忘发起角色”则能够看到一个宽接口——能够得到自己放入备忘录角色中属性。

十六 调停者模式

     调停者模式有着分层设计的锥形,调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。
系统中有大量的对象,这些对象既会影响别的对象,又会被别的对象所影响,因此常常叫做同事(Colleague)对象。
抽象调停者(Mediator)角色:定义出同事对象到调停者对象的接口,其中主要的方法是一个(或多个)事件方法。在某些情况下,这个抽象对象可以省略。
具体调停者(ConcreteMediator)角色:实现了抽象超类所声明的事件方法。具体调停者知晓所有的具体同事类,它从具体同事对象接收消息,向具体同事对象发出命令。
抽象同事类(Colleague)角色:定义出调停者到同事对象的接口。同事对象只知道调停者而不知道其余的同事对象。

 

  

 

 

十七 解释器模式

     描写简单语法的解释器,主要用在面向对象语言开发编译器中
定义上下文context类,定义HashMap
定义抽象类表达式Expression,定义方法interpret(Context con)
定义变量Variable,常量Constant,加法Add,减法Subtract,乘法Multiply ,除法Division 类表达式
计算 (a*b)/(a-b+2)

 

十八 命令模式 

      解耦了发送者和接受者之间联系。 发送者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,
发送者无需知道接受者任何接口。
将这些命令封装成在一个类中,将这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,
这就是Command模式,换句话说,本来用户(调用者)是直接调用这些命令的,如菜单上打开文档(调用者),
就直接指向打开文档的代码,使用Command模式,就是在这两者之间增加一个中间者,将这种直接关系拗断,
同时两者之间都隔离,基本没有关系了.
在这个例子中,被操作的对象有电风扇(fan)和灯(light),他们主要有开和关两种动作。把操作开或者关的请求封装成一个对象,
于是就有了在本例中就有FanOn(Off)Command和lightOn(Off)Command四个类,每个类都实现了Command接口,具备执行和撤销操作。
这些对象的协作关系是 Client创建一个具体的命令对象(fanOnCommand) 并指定他的Receiver(fan)对象,
Invoker(dealer)对象存储该具体的命令对象,该Invoker通过调用Command对象的Execute对象的Execute操作来提交一个请求,
若该命令是可撤销的,具体的命令对象就再执行Execute之前存储当前的状态以取消该命令。
具体对象调用它的Receiver对象的一些操作以执行该请求。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       

 

 

 

(5) 具体同时者 ,房客

public class Lodger extends Colleague {
 
 private String requireInfo;

 public Lodger(Mediator mediator) {
  super(mediator);
  // TODO Auto-generated constructor stub
 }
   
 /**
  * 房客具体的行为方法,例如,将租房需求交给中介等
  */
 
 @Override
 public void action() {
  requireInfo="进行将租房需求交给中介等操作";
 }

 public String getRequireInfo() {
  return requireInfo;
 }

}

 

Client:

public class MediatorClient {
 public static void main(String []args){
  ConcreteMediator c = new ConcreteMediator();
  c.colleagueChanged();
 }
}

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java设计模式是一套对代码设计经验的总结,被人们反复利用,并且很多人都熟知的代码设计方式。其中,单例模式是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这种模式有几个好处,比如可以节约系统资源,提高程序效率,以及提供一个全局访问点等。在实现单例模式时,可以采用饿汉式单例模式,即在加载时创建一个对象,并通过私有构造器和静态方法来保证对象的唯一性。另外,工厂方法模式也是Java中常用的设计模式之一。在工厂方法模式中,可以定义一个工厂,该负责创建对象的实例,并将其封装在一个工厂方法中。通过这种方式,可以实现对象的创建与使用的分离,提高代码的灵活性和可维护性。总的来说,Java设计模式是一种用于解决特定问题的通用解决方案,可以提高代码的重用性、可读性和可扩展性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java常用设计模式](https://blog.csdn.net/qq_33327680/article/details/123815614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [JAVA中23种设计模式](https://blog.csdn.net/qw_0214/article/details/78878531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值