![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
amadeus_liu2
这个作者很懒,什么都没留下…
展开
-
设计模式:22-调停者模式(中介者模式)
一、适用场景:中介者模式提供了一个中介类来处理不同类之间的通信,降低各个类的相互耦合。比如同事之间的沟通,并不直接找对方,而是把消息发给项目管理者,由管理者去发送消息。二、示例1.创建抽象调停者类package cn.edu.tju.app;public abstract class Mediator { public abstract void sendMessage(Colleague colleague,String name,String content); public原创 2022-01-21 16:31:10 · 851 阅读 · 0 评论 -
设计模式:21-组合模式
一、适用场景:表示对象的【整体–部分】树形层次结构,同时忽略单个对象和组合对象的差异。比如一颗树,是由分支节点和叶子结点组成的层次结构,同时,我们希望给用户提供统一的接口对结点进行操作,不论是分支结点还是叶子结点二、示例。1.定义抽象的结点类:package cn.edu.tju.app;public abstract class TreeNode { private String content; public String getContent() { ret原创 2022-01-20 21:04:48 · 538 阅读 · 0 评论 -
设计模式:20-备忘录
一、使用场景:有时候需要将对象状态保存到另一个对象种,在需要的时候进行恢复,比如打游戏时的存盘。二、示例1.创建备忘录类,用于保存状态信息:package cn.edu.tju.app;public class Memento { private int state; public int getState() { return state; } public void setState(int state) { this.sta原创 2022-01-20 20:05:03 · 2278 阅读 · 0 评论 -
设计模式:19-状态模式
一、适用场景:对象的行为由其当前所属的状态决定的场景。比如微信支付,用户的取消支付这个行为,具体要做什么是由当前的支付状态决定的,当前的支付状态不通,取消支付这个行为会走不同的逻辑。二、示例1.定义一个支付状态抽象类:package cn.edu.tju.app;public abstract class PaymentState { public abstract void continuePayment(); public abstract void cancelPaymen原创 2022-01-18 09:33:29 · 444 阅读 · 0 评论 -
设计模式:18-访问者模式
一、适用场景:对象包含的属性基本不变,但是经常需要在此对象结构上定义新的操作。比如车险公司,它的保险项基本不变,但是,经常需要针对不同的用户给出不同的优惠政策,第一年没有折扣,第二年打八折,等等。二、示例。1.定义一个车险抽象类,其中acceptVisit接口用来给访问者提供服务。package cn.edu.tju.app;public abstract class CarInsurance { public abstract void acceptVisit(CarInsuranceV原创 2022-01-17 10:47:34 · 297 阅读 · 0 评论 -
设计模式:17-享元模式
1.适用场景:主要用于减少创建对象的数量,尝试重用现有的同类对象,只有当未找到匹配的对象,则创建新对象。2.示例:java中的String类为典型的享元模式。package cn.edu.tju.app;public class FlyweightTest { public static void main(String[] args) { String str1="hello"; String str2="hello"; String st原创 2022-01-16 20:59:47 · 161 阅读 · 0 评论 -
设计模式:16-责任链模式
一、适用场景:一个产品需要经过多个环节进行处理,类似于生产的流水线,每一个处理步骤只完成自己的责任,然后交给下一个环节进行处理。二、典型应用:Netty的多个ChannelInboundHandlerAdapter的子类组成一个处理的责任链,分别进行处理。1.引入Netty依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:原创 2022-01-11 22:14:47 · 244 阅读 · 0 评论 -
设计模式:15-原型模式
一、适用场景:通过已经存在的对象直接克隆出新对象的场景。比如有一个Person对象,其各个属性都已经设置完成,现在需要克隆出一个新的对象并进行少量修改。二、示例1.姓名类(Name)定义package cn.edu.tju.app;public class Name implements Cloneable{ private String firstName; private String lastName; public String getFirstName() {原创 2022-01-10 22:29:40 · 180 阅读 · 0 评论 -
设计模式:14-迭代器模式
一、迭代器模式提供一种方法来访问一个容器对象中的各个元素,使该对象的内部细节对外部是隐藏的。二、示例,一个球类迭代器类包含了football、volleyball、baseball等各个元素,该类提供了两个方法hasNext()和next()方法用来对各个元素进行迭代package cn.edu.tju.app;import java.util.Iterator;import java.util.LinkedList;import java.util.List;public class Ba原创 2022-01-10 09:50:31 · 98 阅读 · 0 评论 -
设计模式:13-适配器模式
一、应用场景:原本有不能一起工作的两个类,现在将其中的一个类通过适配器类包装起来给另一个类用。二、示例:package cn.edu.tju.app;import java.io.*;public class AdapterTest { public static void main(String[] args) throws Exception{ InputStream inputStream=new FileInputStream("c:\\00\\00.txt");原创 2022-01-09 22:21:46 · 274 阅读 · 0 评论 -
设计模式:12-抽象工厂
一、抽象工厂是工厂方法模式的进一步升级,它消除了对象创建过程中的与不同工厂类的耦合二、示例代码1.定义抽象类package cn.edu.tju.app;//定义交通工具抽象类public abstract class Vehicle { //定义"启动"抽象方法 public abstract void start();}2.定义上述抽象类的2个实现类package cn.edu.tju.app;public class Car extends Vehicle {原创 2022-01-03 19:59:55 · 247 阅读 · 0 评论 -
设计模式:11-简单工厂、静态工厂、工厂方法
一、简单工厂:使用工厂类代替new 来创建对象1.定义抽象类package cn.edu.tju.app;//定义交通工具抽象类public abstract class Vehicle { //定义"启动"抽象方法 public abstract void start();}2.定义上述抽象类的2个实现类package cn.edu.tju.app;public class Car extends Vehicle { @Override public原创 2022-01-02 20:42:30 · 530 阅读 · 0 评论 -
设计模式:10-装饰器模式
一。适用场景:在一个现有类增加新的功能的场景,基本的思路是用类的聚合代替继承。该模式和桥接模式比较相似。二。比如,有一个形状(Shape)接口(interface),定义如下:package cn.edu.tju.app;public interface Shape { void drawIt();}其有两个实现类:Rectangle和Circle,package cn.edu.tju.app;public class Rectangle implements Shape {原创 2021-12-29 22:54:44 · 198 阅读 · 0 评论 -
设计模式:09-模板方法模式
一。适用场景:类给外部提供的方法中的步骤是固定的,每一个步骤对应类中的一个方法。可以将这些方法定义为抽象方法,由子类实现这些抽象方法。二。比如,体育比赛,其中的基本步骤都是固定的:开始比赛、比赛进行、结束比赛。可以定义一个抽象类SportsGame,其提供一个对外的接口haveASportsGame(),并定义3个抽象方法:startGame(),inGame(),stopGame()package cn.edu.tju.app;public abstract class SportsGame {原创 2021-12-28 16:41:52 · 167 阅读 · 0 评论 -
设计模式:08-外观模式
1.适用场景:一个系统有多个子系统,每个子系统有相应的接口。现在新建一个接口来封装现有的不同系统的接口,来为外界提供同一的服务。2.示例,我们在京东购物,京东APP就充当了“外观”的角色,当我们下单后,它会分别调用不同的子系统的接口,最终把商品送到我们手中。package cn.edu.tju.app;public class ProductService { public void prepareProduct(String productName,int count){原创 2021-12-27 10:58:27 · 126 阅读 · 0 评论 -
设计模式:07-桥接模式
一。适用场景:某类事物的属性在两个及以上的维度发生变化。二。示例。比如跑车,有品牌的不同,有颜色的不同。可以定义一个跑车接口,package cn.edu.tju.app;public interface SportsCar { //描述跑车的品牌信息 void describe();}然后定义连个实现类,来分别表示不同品牌的跑车,package cn.edu.tju.app;public class BenzSportsCar implements SportsCar原创 2021-12-23 22:41:26 · 458 阅读 · 0 评论 -
设计模式:06-策略模式
一。使用场景:对某个行为有多种算法的情形。比如电商促销,计算商品价格,6.18有相应的价格计算方法,11.11有相应的价格计算方法。可以将价格计算方法封装成策略类。二。代码实现。1.定义价格计算接口package cn.edu.tju.app;public interface DiscountStrategy { double getDiscountPrice(double price);}2.定义计算打折后价格的策略类。package cn.edu.tju.app;publ原创 2021-12-22 09:51:50 · 189 阅读 · 0 评论 -
设计模式:05-命令模式
一。适用场景:将对象进行的操作与对象本身进行分离的场景。二。示例。比如一个整形数组,可以按照升序和降序进行排序。可以定义一个接口,该接口包含两个命令:ascendSort(升序排序)和descendSort(降序排序)。接口定义如下:package cn.edu.tju.app;public interface SortCommand { void ascendSort(int[] array); void descendSort(int [] array);}然后定义两个原创 2021-12-21 16:05:12 · 77 阅读 · 0 评论 -
设计模式:04-构建者模式
一。适用场景:构造比较复杂的对象。这种场景需要两个类:一个类是原始类,另一个是构建者类,用于构建原始类的对象。比如,一个Computer类,一个ComputerBuilder类,用于构建Computer类对象。二。常用的两种方式:1。原始类和构建者类为独立的类。2。构建者类为原始类的内部静态类。三。第二种方式的常用写法例如Computer类,该类有2个属性cpu和memory,首先按照通常的方法定义该类,示例代码如下:package cn.edu.tju.app;public class Co原创 2021-12-18 19:47:21 · 80 阅读 · 0 评论 -
设计模式:03-单例模式
一.使用单例模式的场景:有些时候某个类的实例只需要一个而不需要多个的时候,比如一些Factory类。二。常用的几种单例构造方法:1.饿汉模式:示例代码如下:package cn.edu.tju.app;import java.util.Date;public class SimpleSingleton { private static SimpleSingleton instance=new SimpleSingleton(); //构造方法,private,防止通过new来原创 2021-12-17 15:17:55 · 617 阅读 · 0 评论 -
设计模式:02-观察者模式
一、使用场景: 适用于当一个对象的状态发生变化时主动去通知另一个对象的场景。二、使用步骤:1.定义被观察者类,该类继承java.util.Observable,并在类中提供一个给外部进行调用的方法,在该方法中需要进行两部操作:setChanged();notifyObservers(xxx);其中第二个方法调用中传入的值就是观察者收到的值。示例类如下:package cn.edu.tju.app;import java.util.Observable;public class Pric原创 2021-12-16 15:00:02 · 739 阅读 · 0 评论 -
设计模式:01-代理模式
一。使用代理模式的场景:对已经开发好的类进行功能增强(添加或修改),比如有一个接口:package cn.edu.tju.service;public interface Living { void eat(); void drink();}以及该接口的一个实现类:package cn.edu.tju.app;import cn.edu.tju.service.Living;public class ChinesePerson implements Living {原创 2021-12-15 10:19:32 · 639 阅读 · 0 评论