java进阶之Java编程大牛带你学习设计模式,醍醐灌顶

java进阶之Java编程大牛带你学习设计模式,醍醐灌顶

小熊进阶之Java编程大牛带你学习设计模式

java进阶之Java编程大牛带你学习设计模式,醍醐灌顶

小熊进阶之Java编程大牛带你学习设计模式

  • 为什么要学习设计模式

1、软件开发越来越复杂,对软件设计的要求也越来越高。而软件设计和架构的入门功夫就是深入理解和掌握设计模式。因此,设计模式的重要性就不言而喻了。

2、设计模式已经成为软件开发人员的“标准词汇”

3、学习设计模式是个人提高的捷径。为什么这么说呢?因为设计模式其本质是很多前辈(大牛级人物)经验的积累,都是一些相对优秀的解决方案,而且很多问题都是典型的有代表性的问题。我们可以透过设计模式去学习到这些牛人的解决方法,看看人家是怎么解决的。我们学习设计模式就可以学习到众多前辈的经验,吸收和领会他们的设计思想。掌握他们解决问题的办法。变相就相当于你跟牛人在学习了。这时候就相当于站在这些巨人的肩膀上,可以让自己的能力得到快速的提升。虽然说学习设计模式有一定的难度,但绝对是快速提高个人能力的捷径。有句话叫强将将手下无弱兵。虽然我们可能达不到这些牛人的水平,但我们可以吸收他们的一些精华;吸收他们一部分思想;吸收他们解决问题的方式和方法。其实无形当中自己的水平也会提高不少。

4、不用重复发明轮子。设计模式本身就是解决特定问题的方式和方案,当我们遇到这些问题的时候,就可以直接使用这些设计模式了。这样可以节省我们大量的时间,而不用在花时间去找解决方案了。

好的,接下来进入正题。下面主要介绍下策略模式:

什么是策略模式呢?

java进阶之Java编程大牛带你学习设计模式,醍醐灌顶

小熊进阶之Java编程大牛带你学习设计模式

策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法分别独立于使用算法的用户。

上面的定义你明白了吗?

我觉得聪明伶俐的你肯定已经明白了,那你看看我是怎么理解的吧。

就是将一个基类中一些行为进行分类,然后在应用到具体的类中选择这些具体的类别,下面我们举个例子来看看。

深入理解策略模式

假如现在有个需求,要求你写一个鸭子基类,这个鸭子基类要求有三个方法,分别是quak、fly、display,具体的鸭子种类继承这个基类。

根据这个需求,首先想到的应该是这样的

public class Duck { private String color; public Duck(String color) { super(); this.color = color; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public void quake() { System.out.println("嘎嘎嘎..."); } public void display() { System.out.println("我是一只" + color + "的鸭子"); } public void fly() { System.out.println("飞啊飞啊..."); }}

这个基类完成后,其他的具体鸭子继承这个基类,然后在写其他的特有属性或方法。

但是呢?这是不是存在一些问题呢?所有的鸭子都是‘嘎嘎嘎’的叫吗,所有的鸭子都能飞吗?我觉得肯定有一些比较奇葩的鸭子...所以呢我们这个设计存在这问题,此时应该怎么解决呢?这时候你应该会想到吧这个定义成一个接口,让其他的子类去实现它。具体代码应该如下:

public interface BaseDuck { void quak(); void display(); void fly();

或者我们也可以定义一个抽象类,将一些不怎么需要变化的方法在基类实现,而另外一些方法由子类去实现,示例如下:

public abstract class AbstractDuck { private String color; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public abstract void quak(); public void display() { System.out.println("我是一只" + color + "的鸭子"); } public abstract void fly();}

这时候这个代码还行,但是它真的没有缺陷了吗?可能忽略了一个问题,那就是我们这种设计是为了适应那些比较奇葩的鸭子种类。其他大部分鸭子应该都是一样的叫声和是可以进行飞行的。那么我们在写子类的时候就会写很多冗余的代码,那么我们如何解决这个问题呢?

java进阶之Java编程大牛带你学习设计模式,醍醐灌顶

小熊进阶之Java编程大牛带你学习设计模式

策略模式就是解决这种问题的,它是如何实现的呢?先分析这个基类,quak和fly这两个是容易变化的,客户说不定那一天就要你加一个玩具鸭什么的。所以就这两个行为寄抽取出来,单独进行编写。先定义两个接口QuakBehavior和FlyBehavior,然后在根据需求编写一些子类,如能飞和不能飞、‘嘎嘎嘎’和‘吱吱吱’和不会叫等。示例代码如下:

下面代码是多个文件

//QuackBehavior.java public interface QuackBehavior { void quak(); } //FlyBehavior.java public interface FlyBehavior { void fly(); } //Quack.java public class Quack implements QuackBehavior { @Override public void quak() { System.out.println("嘎嘎嘎..."); } } //Squeak.java public class Squeak implements QuackBehavior { @Override public void quak() { System.out.println("吱吱吱..."); } } //QuackNoWay.java public class QuackNoWay implements QuackBehavior { @Override public void quak() { System.out.println("我不会叫..."); } } //FlyWithWings.java public class FlyWithWings implements FlyBehavior { @Override public void fly() { System.out.println("飞啊飞啊..."); } } //FlyNoWay.java public class FlyNoWay implements FlyBehavior { @Override public void fly() { System.out.println("我不会飞..."); } }

基类应该这样设计:

package model.strategy.v2;public class Duck { private String color; //添加行为接口的字段 private QuackBehavior quackBehavior; private FlyBehavior flyBehavior; public Duck() { } public Duck(String color, QuackBehavior quackBehavior, FlyBehavior flyBehavior) { super(); this.color = color; this.quackBehavior = quackBehavior; this.flyBehavior = flyBehavior; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public void quake() {//调用接口方法 quackBehavior.quak(); } public void display() { System.out.println("我是一只" + color + "的鸭子"); } public void fly() {//调用接口方法 flyBehavior.fly(); }}

现在想想这个问题是不是很好的解决了!如果新的需求来了,我们只要定义一个新的接口实现了,而不需要修改这个基类中的代码。

java进阶之Java编程大牛带你学习设计模式,醍醐灌顶

小熊进阶之Java编程大牛带你学习设计模式

欢迎大家在下方积极吐槽,小编会一一进行查看并回复,期待你的答案哦……

如果喜欢请转发,小小支持一下。


分享到:


相關文章: