设计模式策略模式和工厂模式结合

编程

策略模式是有客户端自行实例化算法类的,而简单工厂模客户端只传参数,不关心对象的生成。

结合两种模式,可以在使用策略模式的时候客户端不再生成算法的对象。修改策略模式的配置类即可。

在之前策略模式基础上,修改如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

<?php

/*

 

* 策略模式:定义一系列算法,并且把每一个算法封装起来,并且使它们可以相互替换

 

* 策略模式使得算法可以独立于使用它的客户而变化

 

*/

  

  

//抽象策略接口,完成某件事情

interface

 

category{

    

public

 

function

 

dosomething();

}

  

//具体算法类,实现具体的事情

class

 

category_a 

implements

 

category{

    

public

 

function

 

dosomething(){

        

echo

 

"do A"

;

    

}

}

  

class

 

category_b 

implements

 

category{

    

public

 

function

 

dosomething(){

        

echo

 

"do B"

;

    

}

}

  

class

 

category_c 

implements

 

category{

    

public

 

function

 

dosomething(){

        

echo

 

"do C"

;

    

}

}

 

class

 

handel_error 

implements

 

category{

    

public

 

function

 

dosomething(){

        

echo

 

"wrong param"

;

    

}

}

//配置类,使用抽象策略接口来配置

class

 

context{

    

public

 

$cg

;

      

    

public

 

function

 

__construct(

$a

){

//构造函数实现了工厂方法

        

switch

 

(

$a

){

            

case

 

"a"

: 

$this

->cg = 

new

 

category_a();

break

;

            

case

 

"b"

: 

$this

->cg = 

new

 

category_b();

break

;

            

case

 

"c"

: 

$this

->cg = 

new

 

category_c();

break

;

            

default

: 

$this

->cg = 

new

 

handel_error();

break

;

        

}

    

}

      

    

public

 

function

 

dodo(){

        

return

 

$this

->cg->dosomething();

//同一方法作用于不同类的对象,产生不同的结果,这在php中就是多态

    

}

}

  

//客户端调用,由客户自己决定使用哪种策略,即客户自行实例化算法类。区别于简单工厂模式

//简单工厂模式是对象的创建模式,客户端不创建对象,只给出参数,由工厂方法来决定创建哪一个实例

//也就是说,简单工厂模式客户端只传参数,策略模式客户端传算法实例

$m

 

= 

new

 

context(

"b"

);

$m

->dodo();

?>

以上是 设计模式策略模式和工厂模式结合 的全部内容, 来源链接: utcz.com/z/518829.html

回到顶部