设计模式-23种设计模式 目录
对象设计原则:
设计模式的类型:
共有 23 种设计模式,这些模式可以分为三大类:
创建型模式:
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
结构型模式:
这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行为型模式:
这些设计模式特别关注对象之间的通信。
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
J2EE 模式:
这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。
MVC 模式(MVC Pattern)
业务代表模式(Business Delegate Pattern)
组合实体模式(Composite Entity Pattern)
数据访问对象模式(Data Access Object Pattern)
前端控制器模式(Front Controller Pattern)
拦截过滤器模式(Intercepting Filter Pattern)
服务定位器模式(Service Locator Pattern)
传输对象模式(Transfer Object Pattern)
设计模式六大原则:
介绍:
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
实现:
将创建一个 Shape 接口和实现 Shape 接口的实体类。
下一步是定义工厂类 ShapeFactory
。
FactoryPatternDemo
类使用 ShapeFactory
来获取 Shape
对象。ShapeFactory
传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。优点:
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们将创建 Shape 和 Color 接口和实现这些接口的实体类。
AbstractFactory
。接着定义工厂类ShapeFactory
和 ColorFactory
,这两个工厂类都是扩展了 AbstractFactory
。FactoryProducer
。AbstractFactoryPatternDemo
类使用 FactoryProducer
来获取 AbstractFactory
对象。AbstractFactory
传递形状信息 Shape(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。AbstractFactory
传递颜色信息 Color(RED / GREEN / BLUE),以便获取它所需对象的类型。单例模式(Singleton Pattern)
注意:
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
getInstance()
方法中需要使用同步锁 synchronized (Singleton.class
) 防止多线程同时进入造成 instance 被多次实例化。我们将创建一个 SingleObject
类。
SingleObject
类有它的私有构造函数和本身的一个静态实例。SingleObject
类提供了一个静态方法,供外界获取它的静态实例。SingletonPatternDemo
类使用 SingleObject
类来获取 SingleObject
对象。意图:
主要解决:
何时使用:
如何解决:
关键代码:
建造者:
导演:
应用实例:
StringBuilder
。优点:
缺点:
使用场景:
注意事项:
与工厂模式的区别是:
我们假设一个快餐店的商业案例。
1、定义以及 UML 建模图
将一个复杂的对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示。
2、使用场景:
3、核心类
以组装一台计算机为主,主要进行组装主机,设置操作系统,设置显示器。
4、具体使用
4.1 计算机抽象类 Computer
// Computer.java
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOs;
protected Computer(){
}
public void setBoard(String board){
mBoard=board;
}
public void setDisplay(String display) {
this.mDisplay = display;
}
public abstract void setOs() ;
@Override
public String toString() {
return "Computer{" +
"mBoard='" + mBoard + '\'' +
", mDisplay='" + mDisplay + '\'' +
", mOs='" + mOs + '\'' +
'}';
}
}
4.2 具体产品类 MacBook
// MacBook.java
public class MacBook extends Computer{
protected MacBook() {
}
@Override
public void setOs() {
mOs="Mac OS X 12";
}
}
4.3 抽象 Builder
// Builder.java
public abstract class Builder {
abstract void buildBoard(String board);
abstract void buildDisplay(String display);
abstract void buildOs();
abstract Computer build();
}
4.4 具体的 Builder
// MacBookBuilder.java
public class MacBookBuilder extends Builder {
private Computer mComputer=new MacBook();
@Override
void buildBoard(String board) {
mComputer.setBoard(board);
}
@Override
void buildDisplay(String display) {
mComputer.setDisplay(display);
}
@Override
void buildOs() {
mComputer.setOs();
}
@Override
Computer build() {
return mComputer;
}
}
4.5 Director类,负责具体的构造 Computer
// Director.java
public class Director {
Builder mBuilser=null;
public Director(Builder builer) {
this.mBuilser = builer;
}
public void construct(String board,String display){
mBuilser.buildDisplay(display);
mBuilser.buildBoard(board);
mBuilser.buildOs();
}
}
4.6 具体使用
// Test.java
public class Test {
public static void main(String[] args){
Builder builder=new MacBookBuilder();
Director pcDirector=new Director(builder);
pcDirector.construct("英特尔主板","Retina显示器");
Computer computer = builder.build();
System.out.println(computer.toString());
}
}
5.总结
为了灵活构造复杂对象,该对象会有多个成员变量,在外部调用的时候,不需要或者不方便一次性创建出所有的成员变量,在这种情况下,使用多个构造方法去构建对象,很难维护,这时候Builder设计模式解决这个问题,进行buid()方法中创建对象,并且将builder传入,该builder中,维护了传入对象的成员变量。
一、前言
今天我们讨论一下 Builder 建造者模式,这个 Builder,其实和模板模式非常的像,但是也有区别。
那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在 Builder 模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这些方法的有机组合,这个类的职责就是监工,规定了到底要怎么样有机的组合这些方法。
在监工类(Director)中,将父类组合进去,然后调用父类的操作来抽象的实现一件事情,这就是面向接口(抽象)变成的妙处了,当然这个 Builder 可以使接口也可以是抽象类,在这里我们使用抽象类。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZtTpfzfM-1616597468923)(C:\Users\27935\AppData\Local\YNote\data\qq25C5E05E50296ED757AF3687EB03FBE8\9291e06b4a114169afb620486d7e984f\clipboard.png)]
二、Builder 模式代码
Builder 抽象类:
// Builder.java
public abstract class Builder {
public abstract void makeString(String str);
public abstract void makeTitle(String title);
public abstract void makeItems(String[] items);
public abstract void close();
}
HtmlBuilder
实现类:
// HtmlBuilder.java
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class HtmlBuilder extends Builder {
private String filename;
private PrintWriter pw;
public void makeTitle(String title) {
filename="D:\\"+title+".html";
try {
pw=new PrintWriter(new FileWriter(filename));
} catch (IOException e) {
e.printStackTrace();
}
pw.println("" +title+"");
pw.println(""
+title+"");
}
public void makeString(String str) {
pw.println(""
+str+"");
}
public void makeItems(String[] items) {
pw.println(""
);
for(int i=0;i<items.length;i++){
pw.println("" +items[i]+"");
}
pw.println("");
}
public void close() {
pw.println("");
pw.close();
}
public String getResult(){
return filename;
}
}
TextBuilder
实现类:
// TextBuilder.java
public class TextBuilder extends Builder {
StringBuffer sb=new StringBuffer();
public void makeTitle(String title) {
sb.append("=====================");
sb.append("["+title+"]"+"\n");
}
public void makeString(String str) {
sb.append("@"+str+"\n");
}
public void makeItems(String[] items) {
for(int i=0;i<items.length;i++){
sb.append(" ."+items[i]+"\n");
}
}
public void close() {
sb.append("=====================");
}
public String getResult(){
return sb.toString();
}
}
Director
监工类:
// Director.java
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder=builder;
}
public void construct(){
String [] items1=new String[]{"奏国歌","升国旗"};
String [] items2=new String[]{"观众鼓掌","有序撤离"};
builder.makeTitle("今日头条");
builder.makeString("毕业典礼");
builder.makeItems(items1);
builder.makeString("典礼结束");
builder.makeItems(items2);
builder.close();
}
}
Main 类:
// Director.java
public class Main {
public static void main(String[] args) {
//String choice="plain";
String choice="html";
if(choice=="plain"){
TextBuilder t=new TextBuilder();
Director d=new Director(t);
d.construct();
System.out.println(t.getResult());
}else if(choice=="html"){
HtmlBuilder html=new HtmlBuilder();
Director d=new Director(html);
d.construct();
System.out.println(html.getResult());
}else{
usage();
}
}
private static void usage() {
System.out.println("使用 plain,编辑文本文件");
System.out.println("使用 html,编辑网页文件");
}
}
三、总结
关于Builder模式,我们一定要分清和模板方法的区别,其实就是到底谁承担了"监工"的责任.
比如说在Main中:
用户根本就不知道有Builder这个抽象类,同样的Director这个监工的根本就不管到底是哪一个实现类,因为任何一个都会被转换为父类,然后进行处理(面向抽象编程的思想),因此很好的实现了隔离。
同样的这样设计的好处是复用了,隔离的越好复用起来就越方便,我们完全可以思考。
假如还有另外一个监工,使用了不同的construct方法来组装这些复杂的事件,那么对于原来的代码我们不用做任何的修改,只用增加这样的一个监工类,然后定义好相应的方法就好了,之后再Main中使用。
这样的一种思想使得我们不用修改源代码,复用(Builder以及其子类)就很方便了。同样的,如果想增加一个新的Builder的子类,只要照着父类的方法进行填充,再加上自己的方法就好了,完全不用修改代码。
这也是一种复用,因此这种复用(组件)的思想在设计模式中随处可见。本质就是高内聚低耦合,组件开发,尽量不修改原来的代码,有可扩展性。
理解了这一点,我们再看看模板方法,责任全放在了父类里,如果责任需要改变,则必须要修改父类中的责任方法了,这样就修改了原来的代码,不利于复用,这也是两者的本质区别。
原型模式(Prototype Pattern)
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。
浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。
我们将创建一个抽象类 Shape 和扩展了 Shape 类的实体类。
下一步是定义类 ShapeCache,该类把 shape 对象存储在一个 Hashtable 中,并在请求的时候返回它们的克隆。
PrototypePatternDemo 类使用 ShapeCache 类来获取 Shape 对象。
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。
我们通过下面的实例来演示适配器模式的使用。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。
默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。
我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。
我们想要让 AudioPlayer 播放其他格式的音频文件。
为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。
AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。
AdapterPatternDemo 类使用 AudioPlayer 类来播放各种格式。
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。
我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们有一个作为桥接实现的 DrawAPI 接口和实现了 DrawAPI 接口的实体类 RedCircle、GreenCircle。
Shape 是一个抽象类,将使用 DrawAPI 的对象。BridgePatternDemo 类使用 Shape 类来画出不同颜色的圆。
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式。
这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
我们将创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。
CriteriaPatternDemo 类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表。
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们有一个类 Employee,该类被当作组合模型类。CompositePatternDemo 类使用 Employee 类来添加部门层次结构,并打印所有员工。
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
可代替继承。
我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。
然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。
RedShapeDecorator 是实现了 ShapeDecorator 的实体类。
DecoratorPatternDemo 类使用 RedShapeDecorator 来装饰 Shape 对象。
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
1、注意划分外部状态和内部状态,否则可能会引起线程安全问题。
2、这些类必须有一个工厂对象加以控制。
我们将创建一个 Shape 接口和实现了 Shape 接口的实体类 Circle。
下一步是定义工厂类 ShapeFactory。
ShapeFactory 有一个 Circle 的 HashMap,其中键名为 Circle 对象的颜色。
无论何时接收到请求,都会创建一个特定颜色的圆。
ShapeFactory 检查它的 HashMap 中的 circle 对象,如果找到 Circle 对象,则返回该对象,否则将创建一个存储在 hashmap 中以备后续使用的新对象,并把该对象返回到客户端。
FlyWeightPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(red / green / blue/ black / white),以便获取它所需对象的颜色。
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
按职责来划分,通常有以下使用场景:
注意事项:
我们将创建一个 Image 接口和实现了 Image 接口的实体类。
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们创建抽象类 AbstractLogger,带有详细的日志记录级别。
然后我们创建三种类型的记录器,都扩展了 AbstractLogger。
每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。
意图:
主要解决:
何时使用:
如何解决:
关键代码:定义三个角色:
应用实例:
优点:
缺点:
使用场景:
注意事项:
命令模式结构示意图:
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们将创建一个接口 Expression 和实现了 Expression 接口的实体类。
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口。
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们通过聊天室实例来演示中介者模式。实例中,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
备忘录模式使用三个类 Memento、Originator 和 CareTaker。
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
观察者模式使用三个类 Subject、Observer 和 Client。
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。
我们将创建一个 State 接口和实现了 State 接口的实体状态类。Context 是一个带有某个状态的类。
StatePatternDemo,我们的演示类使用 Context 和状态对象来演示 Context 在状态改变时的行为变化。
在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。
我们将创建一个定义操作(在这里,是客户的名称)的 AbstractCustomer 抽象类,和扩展了 AbstractCustomer 类的实体类。
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。
StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。
它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。Cricket 和 Football 是扩展了 Game 的实体类,它们重写了抽象类的方法。
TemplatePatternDemo,我们的演示类使用 Game 来演示模板模式的用法。
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。
意图:
主要解决:
何时使用:
如何解决:
关键代码:
应用实例:
优点:
缺点:
使用场景:
注意事项:
我们将创建一个定义接受操作的 ComputerPart 接口。Keyboard、Mouse、Monitor 和 Computer 是实现了 ComputerPart 接口的实体类。我们将定义另一个接口 ComputerPartVisitor,它定义了访问者类的操作。Computer 使用实体访问者来执行相应的动作。
VisitorPatternDemo,我们的演示类使用 Computer、ComputerPartVisitor 类来演示访问者模式的用法。
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
实现
我们将创建一个作为模型的 Student 对象。
MVCPatternDemo,我们的演示类使用 StudentController 来演示 MVC 模式的用法。
业务代表模式(Business Delegate Pattern)用于对表示层和业务层解耦。它基本上是用来减少通信或对表示层代码中的业务层代码的远程查询功能。在业务层中我们有以下实体。
实现
我们将创建 Client、BusinessDelegate、BusinessService、LookUpService、JMSService 和 EJBService 来表示业务代表模式中的各种实体。
BusinessDelegatePatternDemo 类使用 BusinessDelegate 和 Client 来演示业务代表模式的用法。
组合实体模式(Composite Entity Pattern)用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,因为它们是由 EJB 实体 bean 管理的。以下是组合实体 bean 的参与者。
实现
我们将创建作为组合实体的 CompositeEntity 对象。CoarseGrainedObject 是一个包含依赖对象的类。
CompositeEntityPatternDemo,我们的演示类使用 Client 类来演示组合实体模式的用法。
数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。
实现
前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
实现
我们将创建 FrontController、Dispatcher 分别当作前端控制器和调度器。HomeView 和 StudentView 表示各种为前端控制器接收到的请求而创建的视图。
FrontControllerPatternDemo,我们的演示类使用 FrontController 来演示前端控制器设计模式。
拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
实现
我们将创建 FilterChain、FilterManager、Target、Client 作为表示实体的各种对象。AuthenticationFilter 和 DebugFilter 表示实体过滤器。
InterceptingFilterDemo 类使用 Client 来演示拦截过滤器设计模式。
服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候。考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能。以下是这种设计模式的实体。
实现
我们将创建 ServiceLocator、InitialContext、Cache、Service 作为表示实体的各种对象。Service1 和 Service2 表示实体服务。
ServiceLocatorPatternDemo 类在这里是作为一个客户端,将使用 ServiceLocator 来演示服务定位器设计模式。
传输对象模式
传输对象模式(Transfer Object Pattern)用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也被称为数值对象。传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列化的,所以它可以通过网络传输。它没有任何的行为。服务器端的业务类通常从数据库读取数据,然后填充 POJO,并把它发送到客户端或按值传递它。对于客户端,传输对象是只读的。客户端可以创建自己的传输对象,并把它传递给服务器,以便一次性更新数据库中的数值。以下是这种设计模式的实体。
实现
我们将创建一个作为业务对象的 StudentBO 和作为传输对象的 StudentVO,它们都代表了我们的实体。
TransferObjectPatternDemo 类在这里是作为一个客户端,将使用 StudentBO 和 Student 来演示传输对象设计模式。