设计模式十三模板方法:边学边做个生成电子书的工具(python+dart)

63 阅读1分钟

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

主要解决:一些方法通用,却在每一个子类都重新写了这一方法。

何时使用:有一些通用的方法。

如何解决:将这些通用算法抽象出来。

image.png

python实现

from abc import ABCMeta, abstractmethod

from time import sleep

class Windows(metaclass=ABCMeta):
    @abstractmethod
    def start(self):
        pass

    @abstractmethod
    def repaint(self):
        pass
    @abstractmethod
    def stop(self):
        pass

    def run(self):
        self.start();
        while True:
            self.repaint()
            sleep(10)
            break
        self.stop()


class MyWindows(Windows):
    def __init__(self,msg):
        self.msg = msg

    def start(self):
        print("窗口开始运行")
    def stop(self):
        print("窗口结束运行")
    def repaint(self):
        print("repaint  "+self.msg)



MyWindows("hello").run()

dart 实现

abstract class Game {
  void initialize();
  void startPlay();
  void endPlay();
  void play() {
    initialize();
    startPlay();
    endPlay();
  }
}

class Cricket extends Game {
  @override
  void endPlay() {
    // TODO: implement endPlay
    print("endplaying");
  }

  @override
  void initialize() {
    // TODO: implement initialize
    print("initialize");
  }

  @override
  void startPlay() {
    // TODO: implement startPlay
    print("start game");
  }
}

class FootBall extends Game {
  @override
  void endPlay() {
    // TODO: implement endPlay
    print("endplaying");
  }

  @override
  void initialize() {
    // TODO: implement initialize
    print("initialize");
  }

  @override
  void startPlay() {
    // TODO: implement startPlay
    print("startPlay");
  }
}

void main(List<String> args) {
  Game game = Cricket();
  game.play();
  game = FootBall();
  game.play();
}