package com.cheng.zenofdesignpatterns.principle.ocp;
import android.view.View;
import com.cheng.zenofdesignpatterns.ZoDPChapterBaseActivity;
public class ZoDPOpenClosePrincipleActivity extends ZoDPChapterBaseActivity {
@Override
protected void initData() {
mTitleTV.setText("开放关闭原则");
String content = "定义:\n" +
"Software entities like classes,modules and functions should be open for " +
"extension but closed for modifications.\n" +
"一个软件实体如类、模块和函数应该对扩展开发,对修改关闭。\n" +
"软件实体包括以下几个部分:\n" +
"- 项目或软件产品中按照一定的逻辑规划划分的模块\n" +
"- 抽象和类\n" +
"- 方法\n" +
"注意 开闭原则告诉我们应该尽量通过扩展软件实体的行为来实现变化,而不是通过修改" +
"已有的代码来完成变化,它是为软件实体的未来事件而制定的对现行开发设计进行约束的" +
"一个原则。\n" +
"开闭原则对扩展开发,对修改关闭,并不意味着不做任何修改,低层模块的变更,必然" +
"要有高层模块进行耦合,否则就是一个孤立无意义的代码片段。\n\n" +
"为什么要采用开闭原则\n" +
"1. 开闭原则对测试的影响\n" +
"新增加的类,新增加的测试方法,只要保证新增加的类是正确的就可以了\n" +
"2. 开闭原则可以提高复用性\n" +
"3. 开闭原则可以提高可维护性\n" +
"4. 面向对象开发的要求\n\n" +
"如何使用开闭原则\n" +
"1. 抽象约束\n" +
"通过接口或抽象类可以约束一组可能变化的行为,并且能够实现对扩展开放,其包含三层" +
"含义:第一,通过接口或抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽" +
"象类中不存在的public方法;第二,参数类型、引用对象尽量使用接口或者抽象类,而不" +
"是实现类;第三,抽象层尽量保持稳定,一旦确定即不允许修改。\n" +
"2. 元数据(metadata)控制模块行为\n" +
"什么是元数据?用来描述环境和数据的数据,通俗地说就是配置参数,参数可以从文件中获" +
"得,也可以从数据库中获得 -- 其中达到极致的就是控制反转(Inversion of Control)\n" +
"3. 指定项目章程\n" +
"4. 封装变化\n" +
"对变化的封装包含两层含义:第一,将相同的变化封装到一个接口或抽象类中;第二,将不" +
"同的变化封装到不同的接口或抽象类中,不应该有两个不同的变化出现在同一个接口或抽象" +
"类中。封装变化,也就是受保护的变化(protected variations),找出预计有变化或不" +
"稳定的点,我们为这些变化点创建文档的接口,准确地讲是封装可能发生的变化,一旦预测" +
"到或‘第六感’发觉有变化,就可以进行封装。\n\n" +
"最佳实践\n" +
"- 开闭原则也只是一个原则\n" +
"- 项目规章非常重要\n" +
"- 预知变化\n";
mContentTV.setText(content);
}
public void onClick(View v) {
BookStore.sell();
}
}