模板方法(template method)

文章目录

  • 1. 定义
  • 2. 实现
    • 2.1 java实现
    • 2.2 cpp实现
  • 3. 完整代码地址

1. 定义

GOF定义

Define the skeleton of an algorithm in an operation, deferring some steps to
subclasses. Template Method lets subclasses redefinecertain steps of an algorithm
without changing the algorithm’s structure.
在一个操作中定义一个算法的框架,将某些步骤推迟到子类实现。模板方法允许子类重新定义算法的特定步骤而不改变算法的结构。

简单来说就是: 我们可以为一个业务逻辑或者算法,写好一个骨架,然后具体的实现细节,留给子类去做

类图:
模板方法(template method)_第1张图片

  • AbstractClass : 抽象类, 定义好一个业务逻辑(算法)的骨架,并预留部分接口给子类填充
  • ConcteteClass : 实现AbstractClass里需要填充的部分

2. 实现

以看电视为例: 可以分为三个步骤 1.打开电视 2.播放电视 3.关闭电视.
看电视的步骤一样,但是不同厂家电视的操作方法可能不同。
那就将操作电视的细节丢给子类去实现.

  • TvOPerator 对应类图的 AbstractClass
  • XiaomiTvOp 对应类图的 ConcreteClass
  • KangjiaTvOp 对应类图的 ConcreteClass

2.1 java实现

//author sbkun
package designpattern.templatemethod;

abstract class TvOperator {
    abstract void open();
    abstract void close();
    void play() {
        open();
        System.out.println("playing...");
        close();
    }
}

//小米电视
class XiaomiTvOp extends TvOperator {
    @Override
    public void open() {
        System.out.println("Xiami TV open");
    }

    @Override
    public void close() {
        System.out.println("Xiaomi TV close");
    }

};

//康佳电视
class KangjiaTvop extends TvOperator {
    @Override
    public void open() {
        System.out.println("Kangjia TV open");
    }

    @Override
    public void close() {
        System.out.println("Kangjia TV close");
    }

};

public class TemplateMethodDemo {
    public static void main(String args[]) {
        TvOperator tv1 = new XiaomiTvOp();
        TvOperator tv2 = new KangjiaTvop();
        tv1.play();
        System.out.println("\n");
        tv2.play();
    }
}

2.2 cpp实现

#include 
#include 
using namespace std;

class TvOperator {
	public:
	virtual ~TvOperator() = default;
	virtual void open() = 0;
	virtual void close() = 0;
	void play(){
		open();
		cout<<"playing..."<<endl;
		close();
	}
};

//小米电视
class XiaomiTvOp: public TvOperator {
public:
	void open() override {
		cout<<"Xiaomi TV open"<<endl;
	} 
	void close() override {
		cout<<"Xiaomi TV close"<<endl;
	}

};

//康佳电视
class KangjiaTvOp: public TvOperator {
	void open() override {
		cout<<"Kangjia TV open"<<endl;
	} 
	void close() override {
		cout<<"Kangjia TV close"<<endl;
	}
};


int main(int argc, char* argv []) 
{
	TvOperator* tv1 = new XiaomiTvOp;
	tv1->play();
	delete tv1;	

	cout<<endl;

	TvOperator* tv2 = new KangjiaTvOp;
	tv2->play();
	delete tv2;	
}

3. 完整代码地址

该专栏的所有代码都已上传到github, 希望大家能多多批评指正
git链接

你可能感兴趣的:(设计模式,#,行为型模式)