模板方法模式
Last updated
Last updated
package templatemethod
import "fmt"
type IProduct interface {
makeName()
makeUse()
afterSales()
needAfterSales() bool
packageProduct()
}
// golang 中不能定义抽象类,所以,我们使用一个struct 和一个 interface 组合来实现
type Product struct {
iProduct IProduct
}
func NewProduct() *Product {
return &Product{}
}
func (p *Product) makeProduct() {
p.iProduct.makeName()
p.iProduct.makeUse()
if p.iProduct.needAfterSales() {
p.iProduct.afterSales()
}
p.iProduct.packageProduct()
}
func (*Product) makeName() {
fmt.Println("产品命名")
}
func (*Product) makeUse() {
fmt.Println("产品使用手册")
}
func (*Product) afterSales() {
fmt.Println("售后")
}
func (*Product) needAfterSales() bool {
return false
}
func (*Product) packageProduct() {
}package templatemethod
import "fmt"
type DesignPatternProduct struct {
Product
}
func NewDesignPatternProduct() *DesignPatternProduct {
return &DesignPatternProduct{}
}
func (DesignPatternProduct) packageProduct() {
fmt.Println("提供DesignPatternPorduct")
}
func (DesignPatternProduct) needAfterSales() bool {
return true
}
type OtherPorduct struct {
Product
needAfterSalesFlag bool
}
func NewOtherPorduct(needAfterSalesFlag bool) *OtherPorduct {
return &OtherPorduct{needAfterSalesFlag: needAfterSalesFlag}
}
func (o *OtherPorduct) packageProduct() {
fmt.Println("提供OtherPorduct")
fmt.Println("提供OtherPorduct other")
}
func (o *OtherPorduct) needAfterSales() bool {
return o.needAfterSalesFlag
}package templatemethod
import (
"fmt"
"testing"
)
func Test(t *testing.T) {
fmt.Println("pattern start---")
designPatternProduct := NewProduct()
designPatternProduct.iProduct = NewDesignPatternProduct()
designPatternProduct.makeProduct()
fmt.Println("pattern end---")
fmt.Println("start---")
otherProduct := NewProduct()
otherProduct.iProduct = NewOtherPorduct(true)
otherProduct.makeProduct()
fmt.Println("end---")
}package tech.selinux.design.pattern.behavioral.templatemethod;
public abstract class APorduct {
protected final void makeProduct() {
this.makeName();
this.makeUse();
if (needAfterSales()) {
this.afterSales();
}
this.packageProduct();
}
final void makeName() {
System.out.println("产品命名");
}
final void makeUse() {
System.out.println("产品使用手册");
}
final void afterSales() {
System.out.println("售后");
}
// 钩子方法
protected boolean needAfterSales() {
return false;
}
abstract void packageProduct();
}package tech.selinux.design.pattern.behavioral.templatemethod;
public class DesignPatternPorduct extends APorduct {
@Override
void packageProduct() {
System.out.println("提供DesignPatternPorduct");
}
@Override
protected boolean needAfterSales() {
return true;
}
}package tech.selinux.design.pattern.behavioral.templatemethod;
public class OtherPorduct extends APorduct {
private boolean needAfterSalesFlag = false;
@Override
void packageProduct() {
System.out.println("提供OtherPorduct");
System.out.println("提供OtherPorduct other");
}
public OtherPorduct(boolean needAfterSalesFlag) {
this.needAfterSalesFlag = needAfterSalesFlag;
}
@Override
protected boolean needAfterSales() {
return this.needAfterSalesFlag;
}
}package tech.selinux.design.pattern.behavioral.templatemethod;
public class Test {
public static void main(String[] args) {
System.out.println("pattern start---");
APorduct designPatternProduct = new DesignPatternPorduct();
designPatternProduct.makeProduct();
System.out.println("pattern end---");
System.out.println("start---");
APorduct product = new OtherPorduct(false);
product.makeProduct();
System.out.println("end---");
}
}