您的位置:首页 > 其它

笔记整理----高薪课程一 ---扩展(享元模式))

2015-01-23 16:52 190 查看
享元模式,按个人理解就是将共性属性或者方法抽取,形成一个个接口或者抽象类或者方法等。享元模式有两分:内部状态,外部状态。以方法为例:内部状态指的是该方法里边特有的属性或者变量。而外部状态指的是给这个方法传入的参数。
下边的解释是在网上找的资料,所谓享元模式,说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在该模式中,包括抽象的享元,具体的享元,享元工厂以及客户端。其中抽象的享元为公共接口或抽象类,具体的享元实现抽象享元角色所规定的接口,享元工厂负责创建和管理享元角色。

下面写了一个程序实现享元模式:包括抽象享元角色Person.java,两个具体享元角色OldFlyweight.java和YoungFlyweight.java,享元工厂FlyweightFactory.java,最后是一个客户端测试类ClientTest_Flyweight.java。

Person.java:

1

package com.xpec.landon.trainjava.oop;

2

/**

3

* 一个普通的抽象类,人

4

* @author lvwenyong

5

*

6

*/

7

public abstract class Person {

8

/**

9

* 为了享元模式中的方便一些,没有加入private修饰符

10

* 另外为了另一个包下的使用,用protectd修饰

11

*/

12

protected String personName;

13

protected int personAge;

14


15

//右键Source->Generate Getters and Setters

16

public String getPersonName() {

17

return personName;

18

}

19


20

public void setPersonName(String personName) {

21

this.personName = personName;

22

}

23


24

public int getPersonAge() {

25

return personAge;

26

}

27


28

public void setPersonAge(int personAge) {

29

this.personAge = personAge;

30

}

31


32

/**

33

* 抽象方法

34

*/

35

public abstract void sayHello();

36


37

}

38


39


OldFlyweight.java:

1

package com.xpec.landon.trainjava.designpattern;

2


3

import com.xpec.landon.trainjava.oop.Person;

4


5

/**

6

* 具体的一个享元,继承自Person

7

* @author lvwenyong

8

*

9

*/

10

public class OldFlyweight extends Person{

11


12

public OldFlyweight(int age)

13

{

14

this.personAge = age;

15

}

16

public void sayHello()

17

{

18

System.out.println("Hello,I'm the young!");

19

}

20

}

21


22


YoungFlyweight.java:

1

package com.xpec.landon.trainjava.designpattern;

2


3

import com.xpec.landon.trainjava.oop.Person;

4


5

/**

6

* 具体的一个享元,继承自Person

7

* @author lvwenyong

8

*

9

*/

10

public class YoungFlyweight extends Person{

11


12

public YoungFlyweight(int age)

13

{

14

this.personAge = age;

15

}

16


17

public void sayHello()

18

{

19

System.out.println("Hello,I'm the old");

20

}

21

}

22


23


FlyweightFactory.java:

1

package com.xpec.landon.trainjava.designpattern;

2

import java.util.*;

3


4

import com.xpec.landon.trainjava.oop.Person;

5

/**

6

* 享元工厂

7

* @author lvwenyong

8

*

9

*/

10


11

public class FlyweightFactory {

12

//这里用Hashtable,当然也可以用ArrayList等。

13

private Hashtable agedPersons = new Hashtable();

14


15

/**

16

* 创建和管理享元

17

* 如果没有创建具体享元,则创建。

18

* 已创建,则直接获取

19

* @param age 年龄

20

* @return 抽象享元

21

*/

22

public Person getFlyweight(int age)

23

{

24

Person person = (Person)agedPersons.get(age);

25


26

if(person != null)

27

{

28

if(age == person.getPersonAge())

29

{

30

//输出信息方便查看

31

System.out.println("person-" + age + "被直接获取");

32

}

33

}

34


35

if(person == null)

36

{

37

switch (age) {

38

case 25:

39

person = new YoungFlyweight(age);

40

break;

41

case 80:

42

person = new OldFlyweight(age);

43

default:

44

break;

45

}

46


47

//输出信息方便查看

48

System.out.println("person-" + age + "新被创建");

49


50

agedPersons.put(age, person);

51

}

52


53

return person;

54

}

55


56

}

57


58


ClientTest_Flyweight.java:

1

package com.xpec.landon.trainjava.designpattern;

2


3

import com.xpec.landon.trainjava.oop.Person;

4


5

/**

6

* 享元模式中的客户端角色

7

* @author lvwenyong

8

*

9

*/

10

public class ClientTest_Flyweight {

11

public static void main(String []args)

12

{

13

FlyweightFactory flyweightFactory = new FlyweightFactory();

14


15

//第一次测试,应该是直接创建

16

Person oldFlyweight1 = flyweightFactory.getFlyweight(80);

17

Person youngFlyweight1 = flyweightFactory.getFlyweight(25);

18


19

System.out.println(oldFlyweight1.getPersonAge());

20

System.out.println(youngFlyweight1.getPersonAge());

21


22

//第二次测试,应该是直接获取

23

Person oldFlyweight2 = flyweightFactory.getFlyweight(80);

24

Person youngFlyweight2 = flyweightFactory.getFlyweight(25);

25


26

System.out.println(oldFlyweight2.getPersonAge());

27

System.out.println(youngFlyweight2.getPersonAge());

28


29

}

30


31

}

32


33


下面是程序运行截图:



可以看到,第一次使用的时候是直接创建,以后再用到该对象的时候则是直接获取该对象。这就是享元模式的好处。
就好比是创建了一个类,这个被创建好的类可以随时被调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: