软件架构之策略模式

Java
327
0
0
2022-07-27
标签   架构设计

首先在第一篇正式谈论软件架构说明一下,本系列谈论软件架构设计的语言以java为主,主要探讨的其中的原理,这里只是以Java为例,其余面向对象的编程语言都能够实现本文所讲的内容。

假如现在有人叫你利用编程语言来实现两只鸭子duckA与duckB,其中duckA只会“嘎嘎”叫;duckB只会“咕咕”叫。怎么实现呢?

其中,有一类人认为这不很简单嘛,只需写两个类来分别实现代表duckA与duckB;于是实现的代码如下:

软件架构之策略模式

第一类人的实现方法

从上面的代码可以看出,虽然第一类人利用两种类来实现两种具有不同鸣叫方式的鸭子,但是其思维还是典型的面向过程的编程思维,是为了实现而实现;在实际的使用过程中如果想使用DuckA只能实例DuckA,DuckA与DuckB之间没有任何关系。

那如果是稍微懂点面向对象的人就会发现其实DuckA与DuckB都是鸭子,并且它们都有一种call的方法,可以利用继承的思想来编写其中的代码;于是代码如下:

软件架构之策略模式

利用继承的方法来实现两种鸭子

从上面的代码,可以看出虽然比第一种方法,要多写了一个Duck类,但是正是这个多写的这个类,让DuckA与DuckB之间产生了共性,即都有call方法;也许你会问它们产生了关系有什么用;看完下面的代码,你就会发现它的厉害了。

软件架构之策略模式

这时如果我们实现了另一个类,这个类需要你传入一个duck类,就能调用该类的makeDuckCall方法来使鸭子名叫;我们知道duck类是一个抽象类是不能进行实例化的,但是继承它的DuckA与DuckB因为已经对Duck分别进行了不同的实现,所以DuckA与DuckB可以对Duck进行不同的实现。在对DuckCall类进行构造的化,如果传递的DuckA则会叫“嘎嘎”,反之传递的DuckB则会叫“咕咕”。哈哈这时你是不是发现了,如果运用继承的思想,只要我定义一类具有共性的抽象类,那么我可以先不着急去对这个抽象类进行实现,我会告诉别人的开发人员,我现在有一只鸭子就叫Duck并且有一个call方法,你们在你们的代码就可以使用它了,哈哈看到这,你是不是不知不觉中,让自己的代码进行了解耦,使自己的之后在用到的Duck这个类时,不在具体的纠结于此时用哪个具体的实现。

看到这,还没有向大家展示本文的主题---策略模式。策略模式主要是运用接口的方式来实现面向接口编程;其实现方法如下:

软件架构之策略模式

策略模式实现

从上面的代码,可以看出策略模式不仅对鸭子的实现进行抽象,而且对call这个方法也进行了抽象,认为鸭子就具有call的方法,但是call具体怎么实现,它就不用管,来看你具体用采用什么方法来实现Call这个接口,这时就可以专门可以组织一部人专心的去实现不同鸭子call接口的实现方式,在具体用的时候,就把实现的方法代入即可,这样我们的鸭子就有点像变形金刚了,可以通过配置不同实现接口,来让鸭子具有不同的鸣叫方式。

哈哈,最后 希望与大家一起交流,策略模式的使用。