求助一个开闭原则的JAVA小代码

求助一个开闭原则的JAVA小代码,第1张

public class TestFruit {

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 类则是平级的巧锋基类,是为了覆盖所有的页面类型。

假设如果有一种新的导航页面,那么面向基类的方法,就还要去新增一个新的基类覆盖这个特例,面向接口的则只需要扩展出一个新的类型即可,工具类接口不需要新增。

以上的思想,就是面向对象设计规则中 开闭原则的一种体现。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8221622.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存