[HIT]哈工大2021软件构造知识点理解(2)——七大设计模式

        不管怎么看,以我现在的水平,我都不可能在一篇文章中说明白一个设计模式,更别说七个。但如果你完全不知道这七大模式都是什么,那么这篇文章或许对引领你建立对这六种模式理解的框架有所帮助。

        其实Java开发共有23种模式,关于这23种模式CSDN上优秀的文章比比皆是,但因为考试只针对其中六种,故在此为那些正在学习和明年将学习的学弟们写一篇入门的不能再入门的文章。

1)Adapter模式:Adapter模式也叫做适配器模式,什么是这个所谓的适配器模式呢。我来用最通俗的语言举个例子:假设你有一个3.5毫米插头耳机,并且你使用的是老款的安卓手机,上面带有一个3.5插孔耳机孔,你当然可以自由地使用这个耳机。但有一天你要换手机了,换成最新款的苹果手机,上面并不带有3.5插孔耳机孔,而是一个苹果专用接口,你该怎么做呢?将耳机线拆开将其重新焊接上苹果接口?还是给苹果手机拆开凿一个3.5插孔的耳机孔?现实中没有人这么做。因为这时就轮到我们的适配器登场了。只需要一个转换口,将原来的接口转换为适合耳机的接口即可。这里的这个转换口,就是Adapter。在Java编程实际过程中,Adapter一般是将具体类和接口进行转接,Adapter是OCP(Open-Closed Principle)的体现之一。关于更详细的Adapter模式讲解,可参考以下文章:(4条消息) 适配器模式的三种形式_烟雨星空的博客-CSDN博客_适配器模式

2)Decorator模式:装饰者模式,在我看来是这七大模式中最优雅当然也最晦涩难懂的设计模式。举一个经典的例子,也就是奶茶加珍珠的例子。假设一家奶茶店产品有红茶绿茶四季春奶茶,相应的配料有珍珠椰果红豆布丁奥利奥等等,作为软件工程师的你如何为这家店设计一个点餐平台呢?朴素的思想是排列组合,设计一个抽象类Tea,然后为每种具体饮品分别实现,在每个具体类中用bool isPearl,isOrio等等标记加料情况,那如果一个顾客加了三份珍珠怎么办呢?而且在每个具体类中重复的使用相同的bool变量,显然不符合我们避免代码复用的思想。优雅的解决方案是,为PearledTea等具体类设计一个统一的抽象类AddedTea,这个AdderTea继承Tea,且委托具体饮品类如RedTea等中的方法来完成功能,这样就形成了一个层层包装的商品流程。为简化例子,假设功能只有一个getPrice计算价格,一位顾客点了一杯三份珍珠一份奥利奥的红茶,那么包装的效果应如下所示:

关于更详细的Decorator模式讲解可参考:(4条消息) 装饰者模式(通俗易懂)_笔记别偷看-CSDN博客_装饰着模式

3)Template模式:也叫模板模式,这个应该是最好理解的一个设计模式,同样开始举例子:假设用户想进行球类运动,球类运动的一般步骤假设是:换运动服——打球——洗澡——回家,可以见得不管打什么球,用户的换运动服和洗澡步骤都是一样的。那么模板模式的思想就是先设计一个抽象类,直接在其中具体实现换衣服方法和洗澡方法,至于具体打球方法留给各子类去完成。这个模式不贴参考文章了,应该明白意思就理解了,毕竟Lab中用的还蛮多的。

4)Strategy模式:策略模式,主要结合@Override使用。这种模式我们C语言最早期就接触过,用Switch语句选择不同的排序方式然后单步调试观察运行效果,可以类比到策略模式中。策略模式就是用户端动态的选择不同的算法来完成同一个任务,过程是首先构造一个接口,然后客户端传入要使用的算法后通过委托来实现所选择的算法。委托策略一般是Aggregation,也就是较折中的策略。策略模式可以参考(4条消息) 策略模式及简单Java案例代码实现_Len-CSDN博客_策略模式java

5)Iterator模式:迭代器模式是较常用的轻量化模式,最为常见的便是链表List的遍历。迭代器模式设计要求设计者所完成的ADT无需关心容器具体类型的情况下即可完成迭代过程,其具体的实现方式是在ADT中实现Iterable接口,此接口内部只有一个返回一个迭代器的方法,然后再创建一个内部类实现Iterator接口,重写其hasNext()、next()和remove()方法,同样不贴参考文章了,贴一段代码,来自(4条消息) [HITSC]哈工大2020春软件构造复习笔记 (4)_北言栾生的博客-CSDN博客

public class Pair<E> implements Iterable<E> {
	private final E first, second;
	public Pair(E f, E s) { first = f; second = s; }
		public Iterator<E> iterator() {
			return new PairIterator();
		}
	private class PairIterator implements Iterator<E> {
		private boolean seenFirst = false, seenSecond = false;
		public boolean hasNext() { return !seenSecond; }
		public E next() {
			if (!seenFirst) { seenFirst = true; return first; }
			if (!seenSecond) { seenSecond = true; return second; }
			throw new NoSuchElementException();
		}
		public void remove() {
			throw new UnsupportedOperationException();
		}
	}
    //使用隐式方法迭代
    public static void main(String[] args){
		Pair<String> pair = new Pair<String>("foo", "bar");
		for (String s : pair) { ... }
    }
}

6)Visitor模式:访问者模式的总体思想是数据Data与操作Operation分离的思想。实现较为复杂却并不困难:假设你家地下车库中放着各种乱七八糟的东西,如旧衣服篮球报纸玩具,而你要做的是是为你的汽车加油,但对其中大部分物品(Element)这个操作是不合法的,所以朴素的思想是在加油方法中加入判断语句,但如果是一个泛化操作,比如如果找到了玩具做什么,找到了报纸做什么,那么大段的switch-case不仅不优雅而且性能级差。因此Visitor模式的思想是通过一个Visitor抽象类,在其具体实现中实现visit方法,另外定义一个Element接口,在其具体实现中根据应用需求能够完成此时对应的操作,这样在访问时就能利用Dependency策略的委托来完成对应操作。深入学习可以参考(4条消息) 设计模式(JAVA)——Visitor模式_读书 好学 求知-CSDN博客

7)Factory Method模式:工厂方法模式也较好理解,举个例子,假如你要为你们家买一台空调,但还没决定好要买哪个牌子的空调,于是你对卖空调的工厂传入了你的需求。卖空调的工厂有很多子工厂,分别能生产海尔美的格力各种空调,这样一来,不管你买哪个牌子都可以直接与总工厂协商,总工厂再交由子工厂来具体实现为你生产空调这一操作。总工厂相当于一个接口,而子工厂则是这个接口的具体实现类。最为常见的Factory Method模式如使用Collection的时候,假设你要定义一个Map接口局部变量,你既可以实现为HashMap,也可以实现为TreeMap。更多请参考(4条消息) 设计模式之工厂方法模式_Mr.yang的博客-CSDN博客

        以上例子或者思想并不是我独立创造的,而是基本上全部来源于别人优秀的文章,我只是将他们进行总结归纳整合,在此抛砖引玉,希望为大家软件构造学习之路能有所启发有所帮助。

        

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值