面向对象设计模式应用手册_第1页
面向对象设计模式应用手册_第2页
面向对象设计模式应用手册_第3页
面向对象设计模式应用手册_第4页
面向对象设计模式应用手册_第5页
已阅读5页,还剩197页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象设计模式应用手册一、概述

面向对象设计模式(Object-OrientedDesignPatterns)是一套被反复使用的、可解决典型问题的、经过分类编目的、代码设计经验的总结。通过应用设计模式,开发者可以提高代码的可重用性、可维护性和扩展性。本手册将介绍几种常见的面向对象设计模式及其应用场景,并提供相应的实现步骤和示例。

二、设计模式分类及应用

(一)创建型模式

创建型模式主要用于解决对象的创建问题,使对象的创建过程更加灵活和可扩展。常见的创建型模式包括单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。

1.单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点。

应用场景:

-全局配置管理

-日志记录器

-数据库连接池

实现步骤:

(1)将类的构造函数设为私有,防止外部直接创建实例。

(2)提供一个静态方法获取类的唯一实例。

(3)在静态方法中,判断实例是否已存在,若不存在则创建实例。

示例代码:

publicclassSingleton{

privatestaticSingletoninstance;

privateSingleton(){}

publicstaticSingletongetInstance(){

if(instance==null){

instance=newSingleton();

}

returninstance;

}

}

2.工厂模式

工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。

应用场景:

-对象族管理

-根据不同条件创建不同类型的对象

实现步骤:

(1)定义一个产品接口。

(2)创建具体的产品类实现该接口。

(3)定义一个工厂接口,提供创建产品的抽象方法。

(4)创建具体工厂类实现工厂接口,负责创建具体产品。

示例代码:

//产品接口

interfaceProduct{

voiduse();

}

//具体产品

classConcreteProductAimplementsProduct{

publicvoiduse(){

System.out.println("使用产品A");

}

}

//工厂接口

interfaceFactory{

ProductcreateProduct();

}

//具体工厂

classConcreteFactoryAimplementsFactory{

publicProductcreateProduct(){

returnnewConcreteProductA();

}

}

(二)结构型模式

结构型模式关注类和对象的组合,通过组合实现新的结构,提高代码的灵活性和复用性。常见的结构型模式包括代理模式、装饰器模式、适配器模式、桥接模式和组合模式。

1.代理模式

代理模式为其他对象提供一种代理以控制对这个对象的访问。

应用场景:

-访问控制

-远程方法调用

-日志记录

实现步骤:

(1)定义一个主题接口。

(2)创建具体主题类实现主题接口。

(3)创建代理类实现主题接口,并持有具体主题类的引用。

示例代码:

//主题接口

interfaceSubject{

voidrequest();

}

//具体主题

classRealSubjectimplementsSubject{

publicvoidrequest(){

System.out.println("执行具体操作");

}

}

//代理类

classProxySubjectimplementsSubject{

privateRealSubjectrealSubject;

publicProxySubject(RealSubjectrealSubject){

this.realSubject=realSubject;

}

publicvoidrequest(){

System.out.println("代理操作");

realSubject.request();

}

}

(三)行为型模式

行为型模式关注对象之间的通信和职责分配,通过定义对象间的协作关系提高代码的灵活性和可扩展性。常见的行為型模式包括策略模式、模板方法模式、观察者模式、命令模式、状态模式等。

1.策略模式

策略模式定义一系列算法,并将每个算法封装起来,使它们可以互换。

应用场景:

-多种算法选择

-动态切换算法

实现步骤:

(1)定义一个策略接口。

(2)创建具体策略类实现策略接口。

(3)创建上下文类,持有策略接口的引用,并提供设置策略的方法。

示例代码:

//策略接口

interfaceStrategy{

voidexecute();

}

//具体策略A

classConcreteStrategyAimplementsStrategy{

publicvoidexecute(){

System.out.println("执行策略A");

}

}

//上下文类

classContext{

privateStrategystrategy;

publicvoidsetStrategy(Strategystrategy){

this.strategy=strategy;

}

publicvoidexecuteStrategy(){

strategy.execute();

}

}

三、总结

面向对象设计模式是提高代码质量和可维护性的重要工具。通过合理应用设计模式,开发者可以更好地管理代码的复杂性,提高代码的灵活性和可扩展性。本手册介绍了常见的创建型模式、结构型模式和行为型模式,并提供了相应的实现步骤和示例。在实际开发中,应根据具体需求选择合适的设计模式,以达到最佳效果。

二、设计模式分类及应用

(一)创建型模式

创建型模式主要用于解决对象的创建问题,使对象的创建过程更加灵活和可扩展。常见的创建型模式包括单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。

1.单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点。

应用场景:

-全局配置管理:例如,应用级的配置信息,如数据库连接参数、系统常量等,只需一个全局实例即可。

-日志记录器:日志服务通常只需要一个实例来管理所有日志的写入。

-数据库连接池:连接池的管理需要全局唯一,避免重复创建和销毁连接。

实现步骤:

(1)将类的构造函数设为私有,防止外部直接创建实例。

这一步是为了避免外部通过`new`关键字直接创建对象,从而保证实例的唯一性。

(2)提供一个静态方法获取类的唯一实例。

这个静态方法通常称为`getInstance()`,内部会检查实例是否已存在,若不存在则创建实例。

(3)在静态方法中,判断实例是否已存在,若不存在则创建实例。

这种实现方式称为“懒汉式”单例,即在第一次调用`getInstance()`时才创建实例。

示例代码:

publicclassSingleton{

privatestaticSingletoninstance;

privateSingleton(){}

publicstaticSingletongetInstance(){

if(instance==null){

instance=newSingleton();

}

returninstance;

}

}

变种:双重检查锁定(Double-CheckedLocking)

为了解决多线程环境下的性能问题,可以使用双重检查锁定实现线程安全的单例模式。

publicclassSingleton{

privatestaticvolatileSingletoninstance;

privateSingleton(){}

publicstaticSingletongetInstance(){

if(instance==null){

synchronized(Singleton.class){

if(instance==null){

instance=newSingleton();

}

}

}

returninstance;

}

}

注意事项:

-静态字段应在类加载时初始化,避免使用`instance=newSingleton();`这种写法,因为指令重排可能导致实例未被初始化完成。

-使用`volatile`关键字确保`instance`字段的可见性和有序性。

2.工厂模式

工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。

应用场景:

-对象族管理:例如,图形界面库中,不同平台(Windows、Linux)的按钮、菜单等组件需要不同的实现。

-根据不同条件创建不同类型的对象:例如,根据用户等级(普通用户、管理员)创建不同的权限对象。

实现步骤:

(1)定义一个产品接口。

产品接口定义了所有产品类的公共方法。

interfaceProduct{

voiduse();

}

(2)创建具体的产品类实现该接口。

每个具体产品类实现产品接口中的方法。

classConcreteProductAimplementsProduct{

publicvoiduse(){

System.out.println("使用产品A");

}

}

(3)定义一个工厂接口,提供创建产品的抽象方法。

工厂接口定义了创建产品的通用方法。

interfaceFactory{

ProductcreateProduct();

}

(4)创建具体工厂类实现工厂接口,负责创建具体产品。

每个具体工厂类负责创建对应的具体产品。

classConcreteFactoryAimplementsFactory{

publicProductcreateProduct(){

returnnewConcreteProductA();

}

}

示例代码:

//产品接口

interfaceProduct{

voiduse();

}

//具体产品A

classConcreteProductAimplementsProduct{

publicvoiduse(){

System.out.println("使用产品A");

}

}

//具体产品B

classConcreteProductBimplementsProduct{

publicvoiduse(){

System.out.println("使用产品B");

}

}

//工厂接口

interfaceFactory{

ProductcreateProduct();

}

//具体工厂A

classConcreteFactoryAimplementsFactory{

publicProductcreateProduct(){

returnnewConcreteProductA();

}

}

//具体工厂B

classConcreteFactoryBimplementsFactory{

publicProductcreateProduct(){

returnnewConcreteProductB();

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

FactoryfactoryA=newConcreteFactoryA();

ProductproductA=factoryA.createProduct();

productA.use();

FactoryfactoryB=newConcreteFactoryB();

ProductproductB=factoryB.createProduct();

productB.use();

}

}

变种:抽象工厂模式

抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。

实现步骤:

(1)定义一个抽象产品类。

(2)创建具体产品类实现抽象产品类。

(3)定义一个抽象工厂类,提供创建产品的抽象方法。

(4)创建具体工厂类实现抽象工厂类,负责创建具体产品。

示例代码:

//抽象产品A

abstractclassProductA{

abstractvoiduse();

}

//具体产品A1

classConcreteProductA1extendsProductA{

publicvoiduse(){

System.out.println("使用具体产品A1");

}

}

//抽象产品B

abstractclassProductB{

abstractvoiduse();

}

//具体产品B1

classConcreteProductB1extendsProductB{

publicvoiduse(){

System.out.println("使用具体产品B1");

}

}

//抽象工厂

interfaceFactory{

ProductAcreateProductA();

ProductBcreateProductB();

}

//具体工厂1

classConcreteFactory1implementsFactory{

publicProductAcreateProductA(){

returnnewConcreteProductA1();

}

publicProductBcreateProductB(){

returnnewConcreteProductB1();

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

Factoryfactory=newConcreteFactory1();

ProductAproductA=factory.createProductA();

productA.use();

ProductBproductB=factory.createProductB();

productB.use();

}

}

(二)结构型模式

结构型模式关注类和对象的组合,通过组合实现新的结构,提高代码的灵活性和复用性。常见的结构型模式包括代理模式、装饰器模式、适配器模式、桥接模式和组合模式。

1.代理模式

代理模式为其他对象提供一种代理以控制对这个对象的访问。

应用场景:

-访问控制:例如,权限管理,只有授权用户才能访问某些资源。

-远程方法调用:例如,通过代理对象调用远程服务,处理网络延迟和重试逻辑。

-日志记录:在调用真实对象之前或之后记录日志,而无需修改真实对象的代码。

实现步骤:

(1)定义一个主题接口。

主题接口定义了真实对象和代理对象共同的方法。

interfaceSubject{

voidrequest();

}

(2)创建具体主题类实现主题接口。

具体主题类是真实对象,执行实际业务逻辑。

classRealSubjectimplementsSubject{

publicvoidrequest(){

System.out.println("执行具体操作");

}

}

(3)创建代理类实现主题接口,并持有具体主题类的引用。

代理类负责控制对真实对象的访问。

classProxySubjectimplementsSubject{

privateRealSubjectrealSubject;

publicProxySubject(RealSubjectrealSubject){

this.realSubject=realSubject;

}

publicvoidrequest(){

System.out.println("代理操作");

realSubject.request();

}

}

示例代码:

//主题接口

interfaceSubject{

voidrequest();

}

//具体主题

classRealSubjectimplementsSubject{

publicvoidrequest(){

System.out.println("执行具体操作");

}

}

//代理类

classProxySubjectimplementsSubject{

privateRealSubjectrealSubject;

publicProxySubject(RealSubjectrealSubject){

this.realSubject=realSubject;

}

publicvoidrequest(){

System.out.println("代理操作");

realSubject.request();

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

RealSubjectrealSubject=newRealSubject();

SubjectproxySubject=newProxySubject(realSubject);

proxySubject.request();

}

}

变种:动态代理(JavaProxy)

Java提供了`java.lang.reflect.Proxy`类,可以动态创建代理对象。

实现步骤:

(1)定义一个接口。

(2)使用`Proxy.newProxyInstance()`方法创建代理对象。

(3)实现`InvocationHandler`接口,处理方法调用逻辑。

示例代码:

importjava.lang.reflect.InvocationHandler;

importjava.lang.reflect.Method;

importjava.lang.reflect.Proxy;

//主题接口

interfaceSubject{

voidrequest();

}

//真实主题

classRealSubjectimplementsSubject{

publicvoidrequest(){

System.out.println("执行具体操作");

}

}

//代理处理器

classProxyHandlerimplementsInvocationHandler{

privateObjecttarget;

publicProxyHandler(Objecttarget){

this.target=target;

}

publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{

System.out.println("代理操作");

returnmethod.invoke(target,args);

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

RealSubjectrealSubject=newRealSubject();

SubjectproxySubject=(Subject)Proxy.newProxyInstance(

RealSubject.class.getClassLoader(),

newClass<?>[]{Subject.class},

newProxyHandler(realSubject)

);

proxySubject.request();

}

}

2.装饰器模式

装饰器模式动态地给一个对象添加一些额外的职责。与继承相比,装饰器模式更灵活,可以动态组合多个装饰器。

应用场景:

-动态扩展功能:例如,给文本编辑器添加语法高亮、自动补全等功能。

-避免创建过多的子类:例如,通过组合装饰器实现复杂的功能,而不是创建多个子类。

实现步骤:

(1)定义一个组件接口。

组件接口定义了基本功能。

interfaceComponent{

voidoperation();

}

(2)创建具体组件类实现组件接口。

具体组件类提供基本功能。

classConcreteComponentimplementsComponent{

publicvoidoperation(){

System.out.println("执行基本操作");

}

}

(3)创建装饰器类实现组件接口,并持有组件对象的引用。

装饰器类负责添加额外的职责。

classDecoratorimplementsComponent{

privateComponentcomponent;

publicDecorator(Componentcomponent){

ponent=component;

}

publicvoidoperation(){

component.operation();

}

}

(4)创建具体装饰器类继承装饰器类,并添加额外的职责。

具体装饰器类在执行基本功能之前或之后添加额外逻辑。

classConcreteDecoratorAextendsDecorator{

publicConcreteDecoratorA(Componentcomponent){

super(component);

}

publicvoidoperation(){

super.operation();

System.out.println("添加额外职责A");

}

}

示例代码:

//组件接口

interfaceComponent{

voidoperation();

}

//具体组件

classConcreteComponentimplementsComponent{

publicvoidoperation(){

System.out.println("执行基本操作");

}

}

//装饰器

classDecoratorimplementsComponent{

privateComponentcomponent;

publicDecorator(Componentcomponent){

ponent=component;

}

publicvoidoperation(){

component.operation();

}

}

//具体装饰器A

classConcreteDecoratorAextendsDecorator{

publicConcreteDecoratorA(Componentcomponent){

super(component);

}

publicvoidoperation(){

super.operation();

System.out.println("添加额外职责A");

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

Componentcomponent=newConcreteComponent();

ComponentdecoratorA=newConcreteDecoratorA(component);

decoratorA.operation();

}

}

注意事项:

-装饰器模式可以组合多个装饰器,实现复杂的功能。

-装饰器模式与继承模式相比,更灵活,可以动态组合功能。

3.适配器模式

适配器模式将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

应用场景:

-兼容性问题:例如,将旧系统与新系统集成,新旧系统接口不兼容。

-重用现有类:例如,现有类接口不满足当前需求,通过适配器模式进行改造。

实现步骤:

(1)定义一个目标接口。

目标接口定义了客户希望的接口。

interfaceTarget{

voidrequest();

}

(2)创建适配者类实现目标接口。

适配者类持有被适配者的引用,并实现目标接口。

classAdapterimplementsTarget{

privateAdapteeadaptee;

publicAdapter(Adapteeadaptee){

this.adaptee=adaptee;

}

publicvoidrequest(){

adaptee.specificRequest();

}

}

(3)创建被适配者类。

被适配者类需要被适配,但接口不兼容目标接口。

classAdaptee{

publicvoidspecificRequest(){

System.out.println("执行被适配者操作");

}

}

示例代码:

//目标接口

interfaceTarget{

voidrequest();

}

//被适配者

classAdaptee{

publicvoidspecificRequest(){

System.out.println("执行被适配者操作");

}

}

//适配器

classAdapterimplementsTarget{

privateAdapteeadaptee;

publicAdapter(Adapteeadaptee){

this.adaptee=adaptee;

}

publicvoidrequest(){

System.out.println("适配器操作");

adaptee.specificRequest();

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

Adapteeadaptee=newAdaptee();

Targetadapter=newAdapter(adaptee);

adapter.request();

}

}

变种:对象适配器模式

对象适配器模式与类适配器模式类似,但通过组合实现适配,而不是继承。

实现步骤:

(1)定义目标接口和被适配者类。

(2)创建适配器类实现目标接口,并持有被适配者的引用。

示例代码:

//目标接口

interfaceTarget{

voidrequest();

}

//被适配者

classAdaptee{

publicvoidspecificRequest(){

System.out.println("执行被适配者操作");

}

}

//适配器

classAdapterimplementsTarget{

privateAdapteeadaptee;

publicAdapter(Adapteeadaptee){

this.adaptee=adaptee;

}

publicvoidrequest(){

System.out.println("适配器操作");

adaptee.specificRequest();

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

Adapteeadaptee=newAdaptee();

Targetadapter=newAdapter(adaptee);

adapter.request();

}

}

注意事项:

-适配器模式可以使得不兼容的类一起工作。

-对象适配器模式比类适配器模式更灵活,但可能增加对象的复杂性。

(三)行为型模式

行为型模式关注对象之间的通信和职责分配,通过定义对象间的协作关系提高代码的灵活性和可扩展性。常见的行為型模式包括策略模式、模板方法模式、观察者模式、命令模式、状态模式等。

1.策略模式

策略模式定义一系列算法,并将每个算法封装起来,使它们可以互换。

应用场景:

-多种算法选择:例如,排序算法(冒泡排序、快速排序)、支付方式(支付宝、微信支付)等。

-动态切换算法:例如,根据不同场景切换不同的缓存策略(LRU、LFU)。

实现步骤:

(1)定义一个策略接口。

策略接口定义了算法的公共方法。

interfaceStrategy{

voidexecute();

}

(2)创建具体策略类实现策略接口。

每个具体策略类实现策略接口中的方法。

classConcreteStrategyAimplementsStrategy{

publicvoidexecute(){

System.out.println("执行策略A");

}

}

(3)创建上下文类,持有策略接口的引用,并提供设置策略的方法。

上下文类负责调用具体的策略对象。

classContext{

privateStrategystrategy;

publicvoidsetStrategy(Strategystrategy){

this.strategy=strategy;

}

publicvoidexecuteStrategy(){

strategy.execute();

}

}

示例代码:

//策略接口

interfaceStrategy{

voidexecute();

}

//具体策略A

classConcreteStrategyAimplementsStrategy{

publicvoidexecute(){

System.out.println("执行策略A");

}

}

//具体策略B

classConcreteStrategyBimplementsStrategy{

publicvoidexecute(){

System.out.println("执行策略B");

}

}

//上下文类

classContext{

privateStrategystrategy;

publicvoidsetStrategy(Strategystrategy){

this.strategy=strategy;

}

publicvoidexecuteStrategy(){

strategy.execute();

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

Contextcontext=newContext();

context.setStrategy(newConcreteStrategyA());

context.executeStrategy();

context.setStrategy(newConcreteStrategyB());

context.executeStrategy();

}

}

注意事项:

-策略模式可以动态切换算法,提高代码的灵活性。

-策略模式可以避免条件语句的滥用,使代码更清晰。

2.模板方法模式

模板方法模式定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重用父类中的算法框架。

应用场景:

-固定流程中的步骤:例如,数据处理流程(读取数据、处理数据、写入数据)、订单处理流程(验证订单、扣款、发货)等。

-控制子类扩展:例如,确保子类必须实现某些步骤,同时可以自由实现其他步骤。

实现步骤:

(1)定义一个抽象类,包含一个模板方法。

模板方法定义了算法的骨架,包含调用具体步骤的方法。

abstractclassAbstractClass{

publicfinalvoidtemplateMethod(){

stepOne();

stepTwo();

stepThree();

}

protectedabstractvoidstepOne();

protectedabstractvoidstepTwo();

protectedvoidstepThree(){

//默认实现

}

}

(2)创建具体子类实现抽象类中的抽象方法。

具体子类实现算法的具体步骤。

classConcreteClassextendsAbstractClass{

protectedvoidstepOne(){

System.out.println("具体步骤一");

}

protectedvoidstepTwo(){

System.out.println("具体步骤二");

}

}

示例代码:

//抽象类

abstractclassAbstractClass{

publicfinalvoidtemplateMethod(){

stepOne();

stepTwo();

stepThree();

}

protectedabstractvoidstepOne();

protectedabstractvoidstepTwo();

protectedvoidstepThree(){

System.out.println("默认步骤三");

}

}

//具体子类

classConcreteClassextendsAbstractClass{

protectedvoidstepOne(){

System.out.println("具体步骤一");

}

protectedvoidstepTwo(){

System.out.println("具体步骤二");

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

AbstractClassconcreteClass=newConcreteClass();

concreteClass.templateMethod();

}

}

注意事项:

-模板方法模式可以确保算法的结构一致,同时允许子类重写部分步骤。

-模板方法模式可以减少代码重复,提高代码的可维护性。

3.观察者模式

观察者模式定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。

应用场景:

-事件处理系统:例如,GUI事件(按钮点击、窗口关闭)的处理。

-数据监听:例如,股票行情系统,当股票价格变动时,所有订阅者都会收到通知。

实现步骤:

(1)定义一个主题接口,包含添加、删除和通知观察者的方法。

interfaceSubject{

voidattach(Observerobserver);

voiddetach(Observerobserver);

voidnotify();

}

(2)定义一个观察者接口,包含更新方法。

interfaceObserver{

voidupdate();

}

(3)创建具体主题类实现主题接口,并持有观察者列表。

classConcreteSubjectimplementsSubject{

privateList<Observer>observers=newArrayList<>();

publicvoidattach(Observerobserver){

observers.add(observer);

}

publicvoiddetach(Observerobserver){

observers.remove(observer);

}

publicvoidnotify(){

for(Observerobserver:observers){

observer.update();

}

}

}

(4)创建具体观察者类实现观察者接口。

classConcreteObserverimplementsObserver{

privateConcreteSubjectsubject;

publicConcreteObserver(ConcreteSubjectsubject){

this.subject=subject;

this.subject.attach(this);

}

publicvoidupdate(){

System.out.println("观察者收到通知");

}

}

示例代码:

//观察者接口

interfaceObserver{

voidupdate();

}

//主题接口

interfaceSubject{

voidattach(Observerobserver);

voiddetach(Observerobserver);

voidnotify();

}

//具体主题

classConcreteSubjectimplementsSubject{

privateList<Observer>observers=newArrayList<>();

publicvoidattach(Observerobserver){

observers.add(observer);

}

publicvoiddetach(Observerobserver){

observers.remove(observer);

}

publicvoidnotify(){

for(Observerobserver:observers){

observer.update();

}

}

}

//具体观察者

classConcreteObserverimplementsObserver{

privateConcreteSubjectsubject;

publicConcreteObserver(ConcreteSubjectsubject){

this.subject=subject;

this.subject.attach(this);

}

publicvoidupdate(){

System.out.println("观察者收到通知");

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

ConcreteSubjectsubject=newConcreteSubject();

ConcreteObserverobserver=newConcreteObserver(subject);

subject.notify();

}

}

注意事项:

-观察者模式可以实现解耦,主题和观察者之间没有直接依赖关系。

-观察者模式可以动态添加和删除观察者,提高系统的灵活性。

三、总结

面向对象设计模式是提高代码质量和可维护性的重要工具。通过合理应用设计模式,开发者可以更好地管理代码的复杂性,提高代码的灵活性和可扩展性。本手册介绍了常见的创建型模式、结构型模式和行为型模式,并提供了相应的实现步骤和示例。在实际开发中,应根据具体需求选择合适的设计模式,以达到最佳效果。

设计模式应用要点清单:

-创建型模式:

-单例模式:确保单一实例,全局访问。

-工厂模式:创建对象,解耦创建逻辑。

-抽象工厂模式:创建对象族,统一管理。

-建造者模式:复杂对象逐步构建。

-原型模式:复制现有对象,快速创建。

-结构型模式:

-代理模式:控制访问,增强功能。

-装饰器模式:动态添加职责。

-适配器模式:兼容接口,复用代码。

-桥接模式:分离抽象和实现。

-组合模式:树形结构,整体/部分操作。

-行为型模式:

-策略模式:算法封装,动态切换。

-模板方法模式:算法骨架,子类扩展。

-观察者模式:一对多依赖,自动更新。

-命令模式:请求封装,解耦发送者和接收者。

-责任链模式:请求处理链,逐级传递。

-状态模式:状态管理,行为随状态变化。

-中介模式:对象间通信,通过中介。

-迭代器模式:访问集合元素,统一接口。

-访问者模式:操作对象结构,分离数据和行为。

一、概述

面向对象设计模式(Object-OrientedDesignPatterns)是一套被反复使用的、可解决典型问题的、经过分类编目的、代码设计经验的总结。通过应用设计模式,开发者可以提高代码的可重用性、可维护性和扩展性。本手册将介绍几种常见的面向对象设计模式及其应用场景,并提供相应的实现步骤和示例。

二、设计模式分类及应用

(一)创建型模式

创建型模式主要用于解决对象的创建问题,使对象的创建过程更加灵活和可扩展。常见的创建型模式包括单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。

1.单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点。

应用场景:

-全局配置管理

-日志记录器

-数据库连接池

实现步骤:

(1)将类的构造函数设为私有,防止外部直接创建实例。

(2)提供一个静态方法获取类的唯一实例。

(3)在静态方法中,判断实例是否已存在,若不存在则创建实例。

示例代码:

publicclassSingleton{

privatestaticSingletoninstance;

privateSingleton(){}

publicstaticSingletongetInstance(){

if(instance==null){

instance=newSingleton();

}

returninstance;

}

}

2.工厂模式

工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。

应用场景:

-对象族管理

-根据不同条件创建不同类型的对象

实现步骤:

(1)定义一个产品接口。

(2)创建具体的产品类实现该接口。

(3)定义一个工厂接口,提供创建产品的抽象方法。

(4)创建具体工厂类实现工厂接口,负责创建具体产品。

示例代码:

//产品接口

interfaceProduct{

voiduse();

}

//具体产品

classConcreteProductAimplementsProduct{

publicvoiduse(){

System.out.println("使用产品A");

}

}

//工厂接口

interfaceFactory{

ProductcreateProduct();

}

//具体工厂

classConcreteFactoryAimplementsFactory{

publicProductcreateProduct(){

returnnewConcreteProductA();

}

}

(二)结构型模式

结构型模式关注类和对象的组合,通过组合实现新的结构,提高代码的灵活性和复用性。常见的结构型模式包括代理模式、装饰器模式、适配器模式、桥接模式和组合模式。

1.代理模式

代理模式为其他对象提供一种代理以控制对这个对象的访问。

应用场景:

-访问控制

-远程方法调用

-日志记录

实现步骤:

(1)定义一个主题接口。

(2)创建具体主题类实现主题接口。

(3)创建代理类实现主题接口,并持有具体主题类的引用。

示例代码:

//主题接口

interfaceSubject{

voidrequest();

}

//具体主题

classRealSubjectimplementsSubject{

publicvoidrequest(){

System.out.println("执行具体操作");

}

}

//代理类

classProxySubjectimplementsSubject{

privateRealSubjectrealSubject;

publicProxySubject(RealSubjectrealSubject){

this.realSubject=realSubject;

}

publicvoidrequest(){

System.out.println("代理操作");

realSubject.request();

}

}

(三)行为型模式

行为型模式关注对象之间的通信和职责分配,通过定义对象间的协作关系提高代码的灵活性和可扩展性。常见的行為型模式包括策略模式、模板方法模式、观察者模式、命令模式、状态模式等。

1.策略模式

策略模式定义一系列算法,并将每个算法封装起来,使它们可以互换。

应用场景:

-多种算法选择

-动态切换算法

实现步骤:

(1)定义一个策略接口。

(2)创建具体策略类实现策略接口。

(3)创建上下文类,持有策略接口的引用,并提供设置策略的方法。

示例代码:

//策略接口

interfaceStrategy{

voidexecute();

}

//具体策略A

classConcreteStrategyAimplementsStrategy{

publicvoidexecute(){

System.out.println("执行策略A");

}

}

//上下文类

classContext{

privateStrategystrategy;

publicvoidsetStrategy(Strategystrategy){

this.strategy=strategy;

}

publicvoidexecuteStrategy(){

strategy.execute();

}

}

三、总结

面向对象设计模式是提高代码质量和可维护性的重要工具。通过合理应用设计模式,开发者可以更好地管理代码的复杂性,提高代码的灵活性和可扩展性。本手册介绍了常见的创建型模式、结构型模式和行为型模式,并提供了相应的实现步骤和示例。在实际开发中,应根据具体需求选择合适的设计模式,以达到最佳效果。

二、设计模式分类及应用

(一)创建型模式

创建型模式主要用于解决对象的创建问题,使对象的创建过程更加灵活和可扩展。常见的创建型模式包括单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。

1.单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点。

应用场景:

-全局配置管理:例如,应用级的配置信息,如数据库连接参数、系统常量等,只需一个全局实例即可。

-日志记录器:日志服务通常只需要一个实例来管理所有日志的写入。

-数据库连接池:连接池的管理需要全局唯一,避免重复创建和销毁连接。

实现步骤:

(1)将类的构造函数设为私有,防止外部直接创建实例。

这一步是为了避免外部通过`new`关键字直接创建对象,从而保证实例的唯一性。

(2)提供一个静态方法获取类的唯一实例。

这个静态方法通常称为`getInstance()`,内部会检查实例是否已存在,若不存在则创建实例。

(3)在静态方法中,判断实例是否已存在,若不存在则创建实例。

这种实现方式称为“懒汉式”单例,即在第一次调用`getInstance()`时才创建实例。

示例代码:

publicclassSingleton{

privatestaticSingletoninstance;

privateSingleton(){}

publicstaticSingletongetInstance(){

if(instance==null){

instance=newSingleton();

}

returninstance;

}

}

变种:双重检查锁定(Double-CheckedLocking)

为了解决多线程环境下的性能问题,可以使用双重检查锁定实现线程安全的单例模式。

publicclassSingleton{

privatestaticvolatileSingletoninstance;

privateSingleton(){}

publicstaticSingletongetInstance(){

if(instance==null){

synchronized(Singleton.class){

if(instance==null){

instance=newSingleton();

}

}

}

returninstance;

}

}

注意事项:

-静态字段应在类加载时初始化,避免使用`instance=newSingleton();`这种写法,因为指令重排可能导致实例未被初始化完成。

-使用`volatile`关键字确保`instance`字段的可见性和有序性。

2.工厂模式

工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。

应用场景:

-对象族管理:例如,图形界面库中,不同平台(Windows、Linux)的按钮、菜单等组件需要不同的实现。

-根据不同条件创建不同类型的对象:例如,根据用户等级(普通用户、管理员)创建不同的权限对象。

实现步骤:

(1)定义一个产品接口。

产品接口定义了所有产品类的公共方法。

interfaceProduct{

voiduse();

}

(2)创建具体的产品类实现该接口。

每个具体产品类实现产品接口中的方法。

classConcreteProductAimplementsProduct{

publicvoiduse(){

System.out.println("使用产品A");

}

}

(3)定义一个工厂接口,提供创建产品的抽象方法。

工厂接口定义了创建产品的通用方法。

interfaceFactory{

ProductcreateProduct();

}

(4)创建具体工厂类实现工厂接口,负责创建具体产品。

每个具体工厂类负责创建对应的具体产品。

classConcreteFactoryAimplementsFactory{

publicProductcreateProduct(){

returnnewConcreteProductA();

}

}

示例代码:

//产品接口

interfaceProduct{

voiduse();

}

//具体产品A

classConcreteProductAimplementsProduct{

publicvoiduse(){

System.out.println("使用产品A");

}

}

//具体产品B

classConcreteProductBimplementsProduct{

publicvoiduse(){

System.out.println("使用产品B");

}

}

//工厂接口

interfaceFactory{

ProductcreateProduct();

}

//具体工厂A

classConcreteFactoryAimplementsFactory{

publicProductcreateProduct(){

returnnewConcreteProductA();

}

}

//具体工厂B

classConcreteFactoryBimplementsFactory{

publicProductcreateProduct(){

returnnewConcreteProductB();

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

FactoryfactoryA=newConcreteFactoryA();

ProductproductA=factoryA.createProduct();

productA.use();

FactoryfactoryB=newConcreteFactoryB();

ProductproductB=factoryB.createProduct();

productB.use();

}

}

变种:抽象工厂模式

抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。

实现步骤:

(1)定义一个抽象产品类。

(2)创建具体产品类实现抽象产品类。

(3)定义一个抽象工厂类,提供创建产品的抽象方法。

(4)创建具体工厂类实现抽象工厂类,负责创建具体产品。

示例代码:

//抽象产品A

abstractclassProductA{

abstractvoiduse();

}

//具体产品A1

classConcreteProductA1extendsProductA{

publicvoiduse(){

System.out.println("使用具体产品A1");

}

}

//抽象产品B

abstractclassProductB{

abstractvoiduse();

}

//具体产品B1

classConcreteProductB1extendsProductB{

publicvoiduse(){

System.out.println("使用具体产品B1");

}

}

//抽象工厂

interfaceFactory{

ProductAcreateProductA();

ProductBcreateProductB();

}

//具体工厂1

classConcreteFactory1implementsFactory{

publicProductAcreateProductA(){

returnnewConcreteProductA1();

}

publicProductBcreateProductB(){

returnnewConcreteProductB1();

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

Factoryfactory=newConcreteFactory1();

ProductAproductA=factory.createProductA();

productA.use();

ProductBproductB=factory.createProductB();

productB.use();

}

}

(二)结构型模式

结构型模式关注类和对象的组合,通过组合实现新的结构,提高代码的灵活性和复用性。常见的结构型模式包括代理模式、装饰器模式、适配器模式、桥接模式和组合模式。

1.代理模式

代理模式为其他对象提供一种代理以控制对这个对象的访问。

应用场景:

-访问控制:例如,权限管理,只有授权用户才能访问某些资源。

-远程方法调用:例如,通过代理对象调用远程服务,处理网络延迟和重试逻辑。

-日志记录:在调用真实对象之前或之后记录日志,而无需修改真实对象的代码。

实现步骤:

(1)定义一个主题接口。

主题接口定义了真实对象和代理对象共同的方法。

interfaceSubject{

voidrequest();

}

(2)创建具体主题类实现主题接口。

具体主题类是真实对象,执行实际业务逻辑。

classRealSubjectimplementsSubject{

publicvoidrequest(){

System.out.println("执行具体操作");

}

}

(3)创建代理类实现主题接口,并持有具体主题类的引用。

代理类负责控制对真实对象的访问。

classProxySubjectimplementsSubject{

privateRealSubjectrealSubject;

publicProxySubject(RealSubjectrealSubject){

this.realSubject=realSubject;

}

publicvoidrequest(){

System.out.println("代理操作");

realSubject.request();

}

}

示例代码:

//主题接口

interfaceSubject{

voidrequest();

}

//具体主题

classRealSubjectimplementsSubject{

publicvoidrequest(){

System.out.println("执行具体操作");

}

}

//代理类

classProxySubjectimplementsSubject{

privateRealSubjectrealSubject;

publicProxySubject(RealSubjectrealSubject){

this.realSubject=realSubject;

}

publicvoidrequest(){

System.out.println("代理操作");

realSubject.request();

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

RealSubjectrealSubject=newRealSubject();

SubjectproxySubject=newProxySubject(realSubject);

proxySubject.request();

}

}

变种:动态代理(JavaProxy)

Java提供了`java.lang.reflect.Proxy`类,可以动态创建代理对象。

实现步骤:

(1)定义一个接口。

(2)使用`Proxy.newProxyInstance()`方法创建代理对象。

(3)实现`InvocationHandler`接口,处理方法调用逻辑。

示例代码:

importjava.lang.reflect.InvocationHandler;

importjava.lang.reflect.Method;

importjava.lang.reflect.Proxy;

//主题接口

interfaceSubject{

voidrequest();

}

//真实主题

classRealSubjectimplementsSubject{

publicvoidrequest(){

System.out.println("执行具体操作");

}

}

//代理处理器

classProxyHandlerimplementsInvocationHandler{

privateObjecttarget;

publicProxyHandler(Objecttarget){

this.target=target;

}

publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{

System.out.println("代理操作");

returnmethod.invoke(target,args);

}

}

//客户端代码

publicclassClient{

publicstaticvoidmain(String[]args){

RealSubjectrealSubject=newRealSubject();

SubjectproxySubject=(Subject)Proxy.newProxyInstance(

RealSubject.class.getClassLoader(),

newClass<?>[]{Subject.class},

newProxyHandler(realSubject)

);

proxySubject.request();

}

}

2.装饰器模式

装饰器模式动态地给一个对象添加一些额外的职责。与继承相比,装饰器模式更灵活,可以动态组合多个装饰器。

应用场景:

-动态扩展功能:例如,给文本编辑器添加语法高亮、自动补全等功能。

-避免创建过多的子类:例如,通过组合装饰器实现复杂的功能,而不是创建多个子类。

实现步骤:

(1)定义一个组件接口。

组件接口定义了基本功能。

interfaceComponent{

voidoperation();

}

(2)创建具体组件类实现组件接口。

具体组件类提供基本功能。

classConcreteComponentimplementsComponent{

publicvoidoperation(){

System.out.println("执行基本操作");

}

}

(3)创建装饰器类实现组件接口,并持有组件对象的引用。

装饰器类负责添加额外的职责。

classDecoratorimplementsComponent{

privateComponentcomponent;

publicDecorator(Componentcomponent){

ponent=component;

}

publicvoidoperation(){

component.operation();

}

}

(4)创建具体装饰器类继承装饰器类,并添加额外的职责。

具体装饰器类在执行基本功能之前或之后添加额外逻辑。

classConcreteDecoratorAextendsDecorator{

publicConcreteDecoratorA(Componentcomponent){

super(component);

}

publicvoidoperation(){

super.operation();

System.out.println("添加额外职责A");

}

}

示例代码:

//组件接口

interfaceComponent{

voidoperation();

}

//具体组件

classConcreteComponentimplementsComponent{

publicvoidoperation(){

System.out.println("执行基本操作");

}

}

//装饰器

classDecoratorimplementsComponent{

privateComponentcomponent;

publicDecorator(Componentcomponent){

ponent=component;

}

publicvoidoperation(){

component.operation();

}

}

//具体装饰器A

classConcreteDec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论