设计模式之模板方法模式(九)

模板方法模式

简介

         模板方法模式是将公用的代码抽取到父类,并定义可变部分由子类实现的一种模式。

实现方式

         玩家玩游戏的时候会给角色配置服装,那么不可避免给每个玩家都实例一个Player对象,并且设置服装。

普通方式实现

package com.rabbit.pattern.template;

/**
 * Created by vip on 2018/3/9.
 */
public class PlayerA {

    public void clothes() {
        System.out.println("红色的上衣");
    }

    public void trousers() {
        System.out.println("黑色的裤子");
    }

    public void coat() {
        System.out.println("白色的外套");
    }

    public void shoes() {
        System.out.println("黑色的鞋子");
    }

    public void wear() {
        this.clothes();
        this.trousers();
        this.coat();
        this.shoes();
    }

}

package com.rabbit.pattern.template;

/**
 * Created by vip on 2018/3/9.
 */
public class PlayerB {

    public void clothes() {
        System.out.println("白色的上衣");
    }

    public void trousers() {
        System.out.println("灰色的裤子");
    }

    public void coat() {
        System.out.println("黑色的外套");
    }

    public void shoes() {
        System.out.println("黄色的鞋子");
    }

    public void wear() {
        this.clothes();
        this.trousers();
        this.coat();
        this.shoes();
    }

}

package com.rabbit.pattern.template;

/**
 * Created by vip on 2018/3/9.
 */
public class Demo {

    public static void main(String[] args) {
        System.out.println("A玩家的角色搭配");
        new PlayerA().wear();
        System.out.println("B玩家的角色搭配");
        new PlayerB().wear();
    }

}

这样的实现方式可能已经发现问题了,首先PlayerA和PlayerB的wear方法都是一样的,并且其它的clothes/trousers/ coat /shoes方法都是根据用户自定义的去实现。模板方法模式的描述是:抽取公共的给父类,并且定义可变部分由子类实现。

 

模板方法模式

类图

代码

抽取父类

package com.rabbit.pattern.template;

/**
 * Created by vip on 2018/3/9.
 */
public abstract class Player {

    protected abstract void clothes();

    protected abstract void trousers();

    protected abstract void coat();

    protected abstract void shoes();

    public void wear() {
        this.clothes();
        this.trousers();
        this.coat();
        this.shoes();
    }


}
玩家A装扮
package com.rabbit.pattern.template;

/**
 * Created by vip on 2018/3/9.
 */
public class PlayerA extends Player {

    @Override
    protected void clothes() {
        System.out.println("红色的上衣");
    }

    @Override
    protected void trousers() {
        System.out.println("黑色的裤子");
    }

    @Override
    protected void coat() {
        System.out.println("白色的外套");
    }

    @Override
    protected void shoes() {
        System.out.println("黑色的鞋子");
    }

}

玩家B装扮
package com.rabbit.pattern.template;

/**
 * Created by vip on 2018/3/9.
 */
public class PlayerB extends Player {

    @Override
    protected void clothes() {
        System.out.println("白色的上衣");
    }

    @Override
    protected void trousers() {
        System.out.println("灰色的裤子");
    }

    @Override
    protected void coat() {
        System.out.println("黑色的外套");
    }

    @Override
    protected void shoes() {
        System.out.println("黄色的鞋子");
    }

}

Demo
package com.rabbit.pattern.template;

/**
 * Created by vip on 2018/3/9.
 */
public class Demo {

    public static void main(String[] args) {
        System.out.println("A玩家的角色搭配");
        new PlayerA().wear();
        System.out.println("B玩家的角色搭配");
        new PlayerB().wear();
    }

}

总结

看到模板方法模式的实现方式,可能大家就恍然大悟原来抽象继承就是一种设计模式。我们在编程的过程中可能无意就使用到了某种设计模式,但是由于没有系统的学习设计模式不知道自己使用了而已。很多设计模式直接大致相同,只是在职责上有所区别而已。例如装饰者模式和代理模式。

优点

1)  将不变的行为抽取到超类,出去了子类中重复的代码。比较面向对象编程就是要去除重复嘛。


展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie
应支付0元
点击重新获取
扫码支付

支付成功即可阅读