关于java设计模式的一些思考

本文深入探讨了Java中的23种设计模式,包括工厂方法、适配器、装饰器、策略、模板方法、迭代器和访问者等,讲解了其实现原理、应用场景和优缺点,帮助开发者理解和运用这些模式提升代码复用和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于java设计模式的一些思考


java中设计模式的种类

java中有以下23种设计模式:
1.创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
2.结构者模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
3.行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

下面对工厂方法模式、适配器模式、装饰器模式、策略模式、模板方法模式、迭代器模式和访问者模式做一些整理。

工厂方法模式(Factory Method pattern)

当client不知道要创建哪个具体类的实例,或者不想在代码中指明要具体创建的实例时,用工厂方法:定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。

1.简单工厂模式
定义一个工厂类,该工厂类根据传入的参数例如String来判断需要实例化哪个具体类,该方法可以创建不同类型的对象。
简单工厂模式,利用静态方法根据输入参数生成对应的产品,隐藏了产品实例化的细节。但是简单工厂模式违背了开放封闭原则。

2.工厂方法模式
声明一个工厂接口,所有工厂类都需要实现这个接口,一个工厂类只生产一种类的对象。
利用多态,工厂方法克服了简单工厂违背的开放封闭原则的缺点,又保持了封装对象创建过程的优点。

3.抽象工厂模式
当需要针对每种产品生产对应的赠品时,难道我们要新增一个礼物的生产工厂吗?其实没有必要,我们可以利用原有的工厂来生产赠品,即修改工厂接口,添加生产礼物的方法。
在抽象工厂模式中工厂接口,可以包含所有的产品创建的抽象方法。这样一来,一个工厂可以生产不止一种产品。和工厂方法模式一样,抽象工厂模式也实现了开发封闭原则。

适配器模式(Adapter pattern)

适配器模式将一个类的接口转换成客户希望的另外一个接口,使使原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式分为类结构型模式和对象结构型模式两种。

Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。

1.类结构型模式(类适配器)–通过继承实现适配
我们需要访问接口A,同时类B中又有我们需要的功能,但类B与接口A不兼容。这个时候就需要实现一个适配器C,它通过继承B实现A来达到这个目的。

2.对象结构模式(对象适配器)–通过委托实现适配
与类结构型模式的问题一样,只不过我们实现的适配器C是通过实现接口A,并在类中定义一个私有变量类B的引用,在构造时用一个对象C为该引用赋值,再在接口A的方法实现中通过使用对象C来调用类B中的方法。由此可见,类适配器中类之间的耦合度比对象适配器的高,而且要求程序员了解现有组件库中的相关组件的内部结构。

补充:接口适配器模式–通过抽象类实现适配,窄化接口
当存在这样一个接口,其中定义了很多很多方法,而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们要对所有的方法进行实现,就算我们对不需要的方法进行置空,这会导致着这个类变得臃肿,调用不便。为了解决这个问题,我们定义一个抽象类作为间接层,用这个抽象类实现接口,而在抽象类中将所有方法都进行置空。那么我们在创建抽象类的继承类,只需要重写我们需要使用的那几个方法即可。

装饰器模式(Decorator pattern)

装饰器模式指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。采用装饰模式扩展对象的功能比采用继承方式更加灵活。可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。然而,装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。

简单的来说就是,装饰器ConcreteDecorator通过委托来使用被装饰者 ConretetComponent的某些功能,并在此基础上实现一些额外的功能。
注:装饰器ConcreteDecorator和被装饰者需要实现一个通用接口。

策略模式(Strategy pattern)

所谓策略就是解决问题的方法。策略模式,定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式的实现使得算法之间可以自由切换,避免了多重条件判断的使用(如果不用策略模式我们可能会使用多重条件语句,不利于维护),代码的扩展性良好(增加一个策略只需实现接口即可)。但策略模式使得所有的策略类都需要对外暴露。

策略模式的实现其实很简单。首先所有的策略都要实现一个策略接口,然后利用多态,通过委派根据传入策略的不同,来完成方法的不同实现。

模板方法模式(Template Method pattern)

模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

模板方法模式实现的具体思路就是:在父类(抽象类)中定义通用逻辑和各步骤的抽象方法声明,在子类中进行各步骤的具体实现。模板模式采用继承+重写的方式来实现不同的算法。
使用场景:不同的客户端具有相同的算法步骤,但是每个步骤的具体实现不同。

迭代器模式(Iterator pattern)

迭代器模式允许客户端使用实现的迭代器进行显式或隐式的迭代遍历。

迭代器模式即让自己的集合类实现Iterable接口,并根据自己的需求实现接口中的方法:hasNext, next, remove,来定义一个自己的迭代器。

访问者模式(Visitor pattern)

访问者模式用于封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作,实现了操作和数据结构的分离。

访问者模式的设计也比较简单。首先定义一个抽象类(或接口)Visitor,用于声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象是可以被访问的(通过方法重载,实现对不同对象的不同操作)。然后通过继承(实现)Visitor,得到一个具体访问者ConcreteVisitor,这个类通过实现父类的方法,来决定对被访问者的一系列操作。接下来需要定义一个抽象类(或接口)抽象元素Element,用于声明接受哪一类访问者访问,具体到程序中就是accept方法的参数定义哪些对象是可以访问的。而具体元素ConcreteElement就是对抽象元素的继承(实现)。

使用场景:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,又需要避免让这些操作“污染”这些对象的类。

访问者模式符合单一责任原则,具有优秀的扩展性,灵活性高。但是具体元素对访问者公布细节,而且具体元素变更比较困难,访问者依赖的是具体元素,而不是抽象元素,违背了依赖倒转原则。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值