【第22期】观点:IT 行业加班,到底有没有价值?

设计模式之策略模式

原创 2016年05月31日 10:02:01

目录

策略模式

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

一个例子(鸭子)

最初版本

一个简单的鸭子类,不同种类的鸭子继承它实现不同的表现,比如有的鸭子是红头的,有的鸭子是绿头的。在目前的情形看来,这样的继承模型完全满足我们的需求。将公共的功能会游泳会叫都放在一起,减少了代码的冗余。
这里写图片描述

public abstract class Duck{
    public void quack(){
        System.out.println("嘎嘎");
    }
    public void swim(){
        System.out.println("游泳")
    }
    public void display() {
        System.out.println("我是一只鸭子");
    }
}

public class RedHeadDuck extends Duck() {
    public void display() {
        System.out.println("我是一只红头鸭子");
    }
}

稍作改变 继承

有时候会有一些新的特性会加入类中,比如我需要一个相对来说碉堡的鸭子,如果它能够飞就好了。一个普遍的oop的想法就是在抽象类Duck的方法中加入fly()函数。
但问题出现了有一些不能飞的鸭子也因为继承而拥有了会飞的功能。所以我们不得不再每个子类的具体方法中重写fly()方法。并却改变父类就会牵动整个子类。

另一种尝试 面向接口

或许另一种方式就是将这个功能拿出来作为一个接口,对相应的鸭子实现这个接口

public interface Flyable{
    public void fly();      
}

这样虽然减少了对象之间的耦合性,但是如果有很多子类需要实现fly()方法,又会出现代码冗余,我们需要不断的实现fly()方法。

如何解决

使用继承不能很好的解决问题,让所有的子类都有这一行为是不合理的。使用接口,我们就不得不去实现相应的方法,这样就没有办法达到代码复用的功能。

设计原则1
找出应用中可能需要变化之处,把他们独立起来,不要和那些变化的代码混在一起。

可以把fly的行为取出来组件新的类表示行为。

如何设计新的类??

设计原则2
针对接口编程而不是针对实现编程

使用接口编程可以避免在硬编码。也可以理解为使用多态的属性。
可以设计fly功能的接口规范,再去实现具体的飞的行为类,当然行为规范也不是由Duck类来创建,单独的行为类可以实现代码复用。

public class FlyWithWings implements Flyable{
    public void fly(){
        System.out.println("I can fly");
    }
}

public class NoFly implements Flyable{
    public void fly(){
        System.out.println("I can not fly");
        }
}

设计原则3
多组合,少继承

使用组合可以动态的改变行为。
完整的设计模式例子:

public abstract class Duck{
    private Flyable fly;
    public void swim(){
        System.out.println("swim");
    }
    public void fly(){
        fly.fly();
    }
    public void setFly(Flyable fly){
        this.fly = fly;
    }
    public abstract void display();
}

public class RedHeadDuck extends Duck{
    public RedHeadDuck(){}

    public RedHeadDuck(Flyable fly){
        this.fly = fly;
    }
    public void display(){
        System.out.println("I am a RedHeadDuck");
    }
}

public class Test{

    public static void main(String[] args){
        Duck duck  = new RedHeadDuck(new FlyWithWings());
        duck.fly();
    }
} 
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

设计模式-策略模式

序言设计模式是编程所要掌握的重要技能,其实这之前这些模式都看过相关例子源代码,但是时间一久,每次别人问起,什么是策略模式,或者其他。总是说不清道不明,后来干脆说我忘记了。后来仔细想来,其实我当初根本不...

深入设计模式之一:策略模式

合作开发的这段时间,看了不少设计模式,这次分享下我对几个模式的理解,这次说说“策略模式” 官方定义:策略模式定义了算法族,分别封装起来,使算法之间可以相互替换,使算法族独立于使用它的客户。 <span

谈谈java设计模式之策略模式

前言java有很多种设计模式,如果能在实际的应用场景中熟练得运用一些恰当的设计模式,有助于我们的 系统在建设过程中实现组件松耦合,增强扩展性和可维护性,同时适当运用一些设计模式也能增强我们代码的可读...

java设计模式之策略模式

一.设计模式入门         设计模式是人们在面对同类型软件工程设计问题所总结出的一些有用经验。模式不是代码,而是某类问题的通用设计解决方案。         4人组Erich Gamma、Richard Helm、Ralph Johns

设计模式之策略模式

最近在出设计模式,为什么会去学这个玩意呢?因为设计模式确实能给我们带来很多意想不到的好处,主要体现在有很好的弹性,易于维护和变更需求。以前写程序只顾着解决问题,从不考虑程序的扩展性,但是到了后期,为了...

设计模式 之 策略模式

      <span style="color: #0066cc;"

设计模式—策略模式(二)

策略模式         软件领域中的设计模式的重要性不言而喻。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。虽然知道这些特性的定义但是并没有做到真正的理解,这样特性有什么作用?用于什...

java设计模式之策略模式(一)

    设计模式之于程序员,是一种诱惑,不管你信不信,反正我信。不懂则必不会用,学习设计模式,在于在某个时候,需要实现某些功能,你会想到,哦,历经千山万水,原来你也在这里。网上资料云集,看一个例子看不懂,就多看几个,自然知其然且知其所以然。<img title="酷" src="http://www.iteye.com/javascripts/tinymce/plugins/emotions/img/smiley-cool.gif" alt="酷" bor

设计模式C++实现(2)——策略模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最...

Java设计模式——策略模式

《Thinking in Java》看了一大部分,发现其中好多地方讲到了设计模式。自己都没有仔细研究过设计模式,所以有些地方还是看不懂。于是开始了另一本大部头的书《Head First 设计模式》。今天看了第一章,以一种非常轻松,循序渐进的方式将设计模式,很喜欢这本书。大部分内容和实例都摘抄自课本。 1、首先,我们在学习设计模式之前,需要对OO(面向对象编程)有一定的了解。主要为抽象、封装、多态和继承等概念。如果这些不了解,就没法学习设计模式。设计模式就我自己理解是一种思想,是在需求分析之后,架构设计和写代码之前考虑的事情。 2、策略模式:该书的第一章以Duck类及一系列的行为为
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)