今天继续学习CBF4LIFE的设计模式,看到了第13章-----装饰模式。以前看thinking in Java中IO部分,讲到IO管道之间的套接时,作者就说到了此处运用到了装饰模式,当时没太留意什么装饰模式到底是个啥玩意,今天再次接触到它,以免以后忘记了,还是写下来为妙啊。
CBF4LIFE中装饰模式中,举到的“修饰”成绩单的例子很是经典,在这里,我也就照搬啦(故事情节太长,这里主要是看里氏替换原则使用,在此就不用祥讲了)。
先定义抽象的学生成绩单
package com.lonton.decorator;
public abstract class SchoolReport {
public abstract void report();
public abstract void sign(String name);
}
填写成绩单的内容
package com.lonton.decorator;
/**
*
* @author opalshine
*
*/
public class FouthGradeSchoolReport extends SchoolReport {
@Override
public void report() {
System.out.println("尊敬的XXX家长:");
System.out.println(" ......");
System.out.println(" 语文 62 数学65 体育 98 自然 63");
System.out.println(" .......");
System.out.println(" 家长签名: ");
}
@Override
public void sign(String name) {
System.out.println("家长签名为:"+name);
}
}
拿回家给老爸签名
package com.lonton.decorator;
public class Father {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SchoolReport sr = new FouthGradeSchoolReport();
sr.report();
sr.sign("爸爸");
}
}
成绩单啥样
尊敬的XXX家长:
......
语文 62 数学65 体育 98 自然 63
.......
家长签名:
这成绩,老爸气的够呛的,还会给你签名吧,首先准备挨板子吧。当然咯,为了避免一顿板子,我首先得将成绩单修饰修饰哈
定义修饰模板
package com.lonton.decorator;
/**
* Decorator抽象类的目的很简单,就是要让Decorator子类来封装SchoolReport的子类
* @author opalshine
*
*/
public abstract class Decorator extends SchoolReport{
private SchoolReport sr;
public Decorator(SchoolReport sr){
this.sr = sr;
}
public void report(){
this.sr.report();
}
public void sign(String name){
this.sr.sign(name);
}
}
怎么修饰呢?弄虚作假肯定不行,那样被发现了,那就不是一顿板子的事咯。其实这次考试成绩都不高,语文最高分75,数学
78,自然80,嘿嘿,我那60几分跟最高分也差不了多少了(其实也是最后几名啊),另外,班上转学了10几个人,我的排名也
理 所当然的前进了十几名,排到38名了(这个当然就不必和老爸说了)
定义最高分数模板
package com.lonton.decorator;
public class HighScoreDecorator extends Decorator {
public HighScoreDecorator(SchoolReport sr) {
super(sr);
}
private void reportHighScore(){
System.out.println("这次考试语文最高分75,数学78,自然80");
}
public void report(){
this.reportHighScore();
super.report();
}
}
定义排名模板
package com.lonton.decorator;
public class SortDecorator extends Decorator {
public SortDecorator(SchoolReport sr) {
super(sr);
// TODO Auto-generated constructor stub
}
private void reportSort(){
System.out.println("我这次排名38----");
}
public void report(){
super.report();
this.reportSort();
}
}
然后,老爸看到的成绩单就不一样咯
package com.lonton.decorator;
/**
* @author opalshine
*
*/
public class Father {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SchoolReport sr = new FouthGradeSchoolReport();
/**里氏替换原则,基类能出现的地方,子类也一定能够出现
* 里氏替换原则,父类引用指向子类对象
* HighSocreDecorator构造函数中的参数应该是SchoolReport,但这里却是SchoolReport的子类FouthGradeSchoolReport
* 同样,SortDecorator构造函数中的参数也应该是SchoolReport,但是这里却是HighScoreDecorator
* 装饰模式中,充分的体现出了里氏替换原则
*
*/
sr = new HighScoreDecorator(sr);
sr = new SortDecorator(sr);
sr.report();
sr.sign("爸爸");
}
}
这次考试语文最高分75,数学78,自然80
尊敬的XXX家长:
......
语文 62 数学65 体育 98 自然 63
.......
家长签名:
我这次排名38----
家长签名为:爸爸
以高兴,爽快的签了名。嘿嘿,我理解的运用到的里氏替换原则在Father类注释也说明了。
分享到:
相关推荐
http://blog.csdn.net/xingjiarong/article/details/50081857
c++里氏替换原则说明1
详细介绍里氏替换原则的由来和效用 里氏替换在面向对象里面是一个重要概念,用来限制继承的使用,继承作为面向对象三大机制之一,虽然带来诸多优点,但也不可避免的有缺憾,而里氏替换就是叫我们如何避免继承给代码...
里氏替换原则精讲,关于里氏替换原则讲解,谁来监督继承的质量
里氏替换原则有如下特点: 代码共享,减少创建类的工作量 提高代码的重用性 提高代码的可扩展性 提高产品代码的开放性 继承侵入性 只要继承,必须拥有父类的内容 降低代码的灵活性,子类必须拥有...
设计模式6大原则:里氏置换原则
简单介绍 里氏替换原则 简单工程模式 实现任意排序 使用了 is 和 as 方法 ArrayList数组 与 List泛型集合 Hashtable数组 与 Dictionary,v>泛型集合 的基本使用 序列化 将数据存储
里氏代换原则案例程序LSP.zip
里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章《Data Abstraction and Hierarchy》里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该...
里氏替换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。 使用里氏替换...
OO设计原则 --OO设计的LSP里氏替换原则 ,所以使用基类代码的地方,用派生类代码替换后,能够正确的执行动作处理。 ◇ 换句话说,如果派生类替换了基类后,不能够正确执行动作,那么他们的继承关系就应该废除。
设计模式之里氏转换原则
里氏替换原则的定义有: 如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。 定义很完备,但也不太好...
主要介绍了Java的设计模式中里氏替换原则的意义,文中举例来说明里氏替换原则中强调的继承特性方面可能带来的问题,需要的朋友可以参考下
主要介绍了PHP面向对象五大原则之里氏替换原则(LSP),较为详细的分析了里氏替换原则(LSP)的概念、原理并结合实例形式分析了php里氏替换原则(LSP)的简单使用方法,需要的朋友可以参考下
软件设计的里氏替换原则:正方形可以继承长方形吗
7里氏替换原则-课程内容.rar
7里氏替换原则-MOOC课程内容.pdf
这一个学习java的笔记,里面主要介绍java的里氏代换原则