
public static void main(String[] args) {
Fruit fruit
fruit = Gardener.NewFruit("apple")
fruit.grow()
fruit.Flowering()
fruit.Fruiting()
fruit = Gardener.NewFruit("pear")
fruit.grow()
fruit.Flowering()
fruit.Fruiting()
}
}
interface Fruit {
void grow()
void Flowering()
void Fruiting()
}
class Apple implements Fruit {
public void Flowering() {
System.out.println("开花的是苹果")
}
public void Fruiting() {
System.out.println("结果的是苹果")
}
public void grow() {
System.out.println("种植的是苹果")
}
}
class Pear implements Fruit {
public void Flowering() {
System.out.println("开花的是梨")
}
public void Fruiting() {
System.out.println("结果的是梨")
}
public void grow() {
System.out.println("种植的是梨")
}
}
final class Gardener {
public static Fruit NewFruit(String fruitname) {
if (fruitname.equals("apple")) {
return new Apple()
} else if (fruitname.equals("pear")) {
return new Pear()
}
return null
}
}
不知这样写是否正确态梁。个人认为这应该是昌碰一个工厂模式吧。
所有类的实现都由工厂类(也就是园丁类)完成。
写的只是一个简单工厂模式。
通过抽象类及接口,规定了具体类的特征作为抽象层,相对稳定,不需更改,从而帆迅运满足“对修改关闭”;而从抽象类导出的具体类可以改变系统的行为,从而满足“对扩展开放”。开闭原则在问题描述时就已经实现了。当然这只是对于客户端(也就是测试类)来说,测试类只需要提供要创建对象的描述,系统自动创建相应的对象。而对于工厂类并没有满足开闭原则。
假设现在有一个工具类,目的是把传入页面指定区域渲染成红色
定义一个基类 BaseFlushedViewController: UIViewController ,返回一个袜宽判 flushArea , 供工具类进行染色。
那么我们传入的参数必须是他的子类,而且由于每个页面可能需要刷新的视图是不同的,我们理论上应该重写他的 flushArea 方法
这样做的问题有两个:
定义一个协议
将工具类的接口统一成 UIViewController &Flushable
这样做的好处:
看起来面向接口的方法和使用基类的方法相比,只是工具类中的接口统告改一成了一个。但实际上,面向接口的方法中, SomeNavViewController 和 SomeFlushedTabViewController 都是 UIViewController 的一种特例。而使用基类的实现方法中,三种 Base 类则是平级的巧锋基类,是为了覆盖所有的页面类型。
假设如果有一种新的导航页面,那么面向基类的方法,就还要去新增一个新的基类覆盖这个特例,面向接口的则只需要扩展出一个新的类型即可,工具类接口不需要新增。
以上的思想,就是面向对象设计规则中 开闭原则的一种体现。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)