设计模式学习笔记(更新中...)

最近在学一些设计模式,在学习的过程中,我会将学习笔记记入在此地,和大家分享,这篇文章会随时更新

一、设计模式入门

1.1 本章节核心思想:

多用组合,少用继承。

1.2 问题:

模拟鸭子游戏,游戏中会出现各种鸭子,有的鸭子会飞,有的会叫。按照以往的设计模式,我们往往会设计一个鸭子的超类,并让每个鸭子都继承这个类。但是,这样就涉及到一个问题,有的鸭子会叫,有的会飞,有的则不会(比如,像皮鸭)每种鸭子都有它自己的特点,会飞的方式也不一样,但是这需要每种鸭子都需要继承这个类,并且重写里面的会飞和会叫方法,这样,鸭子的种类每多一种,我们都要重写一遍代码,这样的是长不利于日后系统的维护。

在这里插入图片描述
上面那种架构,并不符合我们的设计理念,可以将需要改变的地方,从Duck类里分离出来,设计成接口。
下面的设计模式才是我们真正要实现的
在这里插入图片描述

1.3 实现代码

Duck抽象类,所有鸭子实例都继承此类

ackage com.geng.domain;

import com.geng.inter.FlyBehavior;
import com.geng.inter.QuackBehavior;

/**
 * Duck抽象类,所有鸭子实例都继承此类
 * @author 桃味果仁
 */
public abstract class Duck{
    
    

    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck(){
    
    

    }
    public abstract void display();

    public void  performFly(){
    
    
        flyBehavior.fly();
    }

    public void performQuack(){
    
    
        quackBehavior.quack();
    }

    public void swim(){
    
    
        System.out.println("all duck float");
    }

    public void setFlyBehavior (FlyBehavior flyBehavior){
    
    
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior (QuackBehavior quackBehavior){
    
    
        this.quackBehavior = quackBehavior;
    }
}

FlyBehavior接口,每一种鸭子的飞行方式,需要实现此接口,然后付给鸭子的实例,在执行过程中可以动态改变鸭子的飞行方式

package com.geng.inter;
/**
 * FlyBehavior接口,每一种鸭子的飞行方式,需要实现此接口,
 * 然后付给鸭子的实例,在执行过程中可以动态改变鸭子的飞行方式
 * @author 桃味果仁
 */
public interface FlyBehavior {
    
    
    public void fly();
}

QuackBehavior接口,每一种鸭子的叫的方式,需要实现此接口, 然后付给鸭子的实例,在执行过程中可以动态改变鸭子的叫的方式

package com.geng.inter;

/**
 * QuackBehavior接口,每一种鸭子的叫的方式,需要实现此接口,
 * 然后付给鸭子的实例,在执行过程中可以动态改变鸭子的叫的方式
 * @author 桃味果仁
 */
public interface QuackBehavior {
    
    
    public void quack();
}

FlyBehavior接口的实现类,用于实现一种鸭子的飞行方式, 可以实现多次,添加多种飞行方式

package com.geng.impl;

import com.geng.inter.FlyBehavior;

/**
 * FlyBehavior接口的实现类,用于实现一种鸭子的飞行方式,
 * 可以实现多次,添加多种飞行方式
 * @author 桃味果仁
 */
public class FlyNoWay implements FlyBehavior {
    
    
    @Override
    public void fly() {
    
    
        System.out.println("I can't flying");
    }
}

FlyBehavior接口的实现类2

package com.geng.impl;

import com.geng.inter.FlyBehavior;

/**
 * FlyBehavior接口的实现类2
 * @author 桃味果仁
 */
public class FlyWithWings implements FlyBehavior {
    
    
    @Override
    public void fly() {
    
    
        System.out.println("I'm flying");
    }
}

QuackBehavior接口的实现类,用于实现一种鸭子的叫的方式,可以实现多次,添加多种叫的方式

package com.geng.impl;

import com.geng.inter.QuackBehavior;

/**
 * QuackBehavior接口的实现类,用于实现一种鸭子的叫的方式,
 * 可以实现多次,添加多种叫的方式
 * @author 桃味果仁
 */
public class MuteQuack implements QuackBehavior {
    
    
    @Override
    public void quack() {
    
    
        System.out.println("Quack");
    }
}

QuackBehavior接口的实现类2

package com.geng.impl;

import com.geng.inter.QuackBehavior;

/**
 * QuackBehavior接口的实现类2
 * @author 桃味果仁
 */
public class Squeak implements QuackBehavior {
    
    
    @Override
    public void quack() {
    
    
        System.out.println("Squeak");
    }
}

鸭子实例,每一种鸭子都需要继承Duck

package com.geng.domain;

import com.geng.impl.FlyWithWings;
import com.geng.impl.MuteQuack;

/**
 * 鸭子实例,每一种鸭子都需要继承Duck
 * @author 桃味果仁
 */
public class MallardDuck extends Duck{
    
    

    public MallardDuck(){
    
    
        flyBehavior = new FlyWithWings();
        quackBehavior = new MuteQuack();
    }

    @Override
    public void display() {
    
    
        System.out.println("I'm a real Mallard duck");
    }
}
package com.geng.main;

import com.geng.domain.Duck;
import com.geng.domain.MallardDuck;
import com.geng.impl.FlyNoWay;
import com.geng.impl.Squeak;

public class MiniDuckSimulator {
    
    
    public static void main(String[] args) {
    
    
        Duck mallardDuck = new MallardDuck();
        mallardDuck.performFly();
        mallardDuck.performQuack();
        mallardDuck.display();
        mallardDuck.setFlyBehavior(new FlyNoWay());
        mallardDuck.setQuackBehavior(new Squeak());
        mallardDuck.performFly();
        mallardDuck.performQuack();
        mallardDuck.display();
        mallardDuck.swim();
    }
}

おすすめ

転載: blog.csdn.net/weixin_43742217/article/details/121365643