最近在学一些设计模式,在学习的过程中,我会将学习笔记记入在此地,和大家分享,这篇文章会随时更新
一、设计模式入门
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();
}
}