public void display(){ System.out.println(name); for(int i = 0 ; i < list.size() ;i ++) { list.get(i).display(); } } public void add(Component c){ list.add(c); } public void remove(Component c){ list.remove(c); } }
6. 客户端(4分): public class Test { public static void main(String[] args){ Component root = new Composite(\ root.add(new Leaf(\ Component comp = new Composite(\ root.add(comp); comp.add(new Leaf(\ Component comp = new Composite(\ root.add(comp); comp.add(new Leaf(\ root.display(); } }
(三)
1.一个农场公司,专门负责培育各种水果,有葡萄,草莓和苹果,请使用简单工厂模式,编写简单工厂类和主程序,并在主程序中来完成苹果生长状态的描述。(8分)
2.下图是某系统的数据部分的类图。因为该层次结构中的操作需要经常变化,所以需要用访问者模式对其进行重构,请按以下要求完成题目: (1)绘制重构后系统完整类图。(4分)
(2)给出重构后ElementA类的代码。(4分)
(3)在客户端运用访问者模式,对ElementA的实例,完成CalPrice操作。(2分)
3. 给定如图所示的树形结构,请应用组合模式,在客户端完成数据的展示。具体要求如下: 绘制组合模式的类图。(4分) 2) 编写简单元素的代码。(2分) 3) 编写复杂元素的代码。(6分) 4) 编写客户端的代码(4分) 提示:程序运行后,输出信息应为 Dir1 File1 Dir2 File3 Dir3 File4
答案:
1. Public class FruitFactory{ //4分,要有静态方法,返回fruit
Public static Fruit creatFruit(String type){
Fruit ft = null ;
If(type.equals(“Apple”)
Ft = new Apple();
Else if(type.equals(“Strawberry”)
Ft = new Strawberry(); Else if(type.equals(“Grape”)
Ft = new Grape(); Return ft; } }
Public class MainUI{ //(4分)
Public static void main(string[] str){
Fruit ft = FruitFactory.creatFruit(“Apple”); ft.plant(); Ft.grow(); Ft.harvest(); } }
2.
1)类图为(4分)
2) class ElementA extends Element{//4分 Public void accept(Visitor v){ V.accept(this) } }
3) 客户端 2分
Visitor v = new CalPriceVistor(); ElementA a = new ElementA(); A.accept(v); 3.
1)类图,类名不限,但必须将抽象的概念,以及Composite和Component之间的关系用正确的连线表示。
2)简单元素(2分):
class Leaf implements Component{ String name; public Leaf(String name){ this.name = name; } public void display(){ System.out.println(name); } }
3)复杂元素(6分)
class Composite implements Component{ String name; ArrayList
4)客户端(4分): public class Test { public static void main(String[] args){ Component root = new Composite(\ root.add(new Leaf(\ Component comp = new Composite(\ root.add(comp); comp.add(new Leaf(\ Component comp = new Composite(\ root.add(comp); comp.add(new Leaf(\ root.display(); }
}
六、 详情知识点 面向对象设计原则:
1. 单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个
类只负责一项职责。 2. 开闭原则(重构)(抽象):一个软件实体如类、模块和函数应该对扩展开放,
对修改关闭。 3. 里氏代换原则:
定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。 定义2:所有引用基类的地方必须能透明地使用其子类的对象。
4. 依赖倒转原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
5. 迪米特法则(重构、转发、调用):迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。
6. 接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 7. 合成、聚合、复用原则:
1、继承复用
继承复用通过扩展一个已有对象的实现来得到新的功能,基类明显地捕获共同的属性和方法,而子类通过增加新的属性和方法来扩展超类的实现。继承是类型的复用。
继承复用的优点:
新的实现较为容易,因为超类的大部分功能可通过继承关系自动进入子类;
修改或扩展继承而来的实现较为容易。
继承复用的缺点:
继承复用破坏封装,因为继承将超类的实现细节暴露给子类。“白箱”复用;
如果超类的实现发生改变,那么子类的实现也不得不发生改变。 从超类继承而来的实现是静态的,不可能再运行时间内发生改变,因此没有足够的灵活性。
2、合成/聚合复用
由于合成/聚合可以将已有的对象纳入到新对象中,使之成为新对象的一部分,因此新的对象可以调用已有对象的功能,
其优点在于:
新对象存取成分对象的唯一方法是通过成分对象的接口; 成分对象的内部细节对新对象不可见。 “黑箱”复用;