细学设计模式一(组合与继承)


 1 <?php
2 abstract class Lesson{
3 protected $duration;
4 const FIXED = 1;
5 const TIMED = 2;
6 private $costtype;
7
8 function __construct($duration,$costtype){
9 $this->duration = $duration;
10 $this->costtype = $costtype;
11 }
12
13 function cost(){
14 switch ($this->costtype){
15 case self::TIMED :
16 return (5*$this->duration);
17 break;
18 case self::FIXED:
19 return 30;
20 break;
21 default :
22 $this->costtype = self::FIXED;
23 return 30;
24 }
25 }
26
27 function chargeType()
28 {
29 switch ($this->costtype)
30 {
31 case self::TIMED:
32 return "hourly rate";
33 break;
34 case self::FIXED:
35 return "fixed rate";
36 break;
37 default :
38 $this->costtype = self::FIXED;
39 return "fixed rate";
40 }
41 }
42
43 //Lesson的更多方法
44 }
45
46 class Lecture extends Lesson{
47 //Lecture特定的实现
48 }
49
50 class Seminar extends Lesson{
51 //Seminar特定的实现
52 }
53
54 //下面如何使用这些类
55 $lecture = new Lecture(5,Lesson::FIXED);
56 print "{$lecture->cost()},{$lecture->chargeType()} \n";//30,fixed rate
57
58 $seminar = new Seminar(3,Lesson::TIMED);
59 print "{$seminar->cost()},{$seminar->chargeType()} \n";//15,hourly rate

使用组合:使用策略模式(strategy)来解决条件语句


<?php
abstract class Lesson{
private $duration;

private $costStrategy;

function __construct($duration,CostStrategy $strategy)
{
$this->duration = $duration;
$this->costStrategy = $strategy;
}

function cost()
{
return $this->costStrategy->cost($this);//“委托”另外的类中的方法去执行
}

function chargeType()
{
return $this->costStrategy->chargeType();//“委托”另外的类中的方法去执行
}

function getDuration()
{
return $this->duration;
}

//Lesson的更多方法
}

class Lecture extends Lesson{
//Lecture 特定的实现
}

class Seminar extends Lesson{
//Seminar 特定的实现
}

abstract class CostStrategy{
abstract function cost(Lesson $lesson);

abstract function chargeType();
}

class TimedCostStrategy extends CostStrategy{
function cost(Lesson $lesson)
{
return ($lesson->getDuration()*5);
}

function chargeType()
{
return "hourly rate";
}
}

class FixedCostStrategy extends CostStrategy{
function cost(Lesson $lesson)
{
return 30;
}

function chargeType()
{
return "fixed rate";
}
}

$lessons[] = new lecture(4,new TimedCostStrategy());
$lessons[] = new Seminar(4,new FixedCostStrategy());

foreach ($lessons as $lesson)
{
print "lesson charge: {$lesson->cost()} ";
print "charge type: {$lesson->chargeType()} \n";
}

//lesson charge: 20 charge type: hourly rate
//lesson charge: 30 charge type: fixed rate

细学设计模式一(组合与继承)

时间: 2024-10-14 21:42:58

细学设计模式一(组合与继承)的相关文章

Java编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口.为取得此效果,需要在新类中嵌入一个现有类的private对象.但有时,允许类的用户直接访问新类中的组合成分是极具意义的,即将成员对象声明为public.如果成员对象自身都隐藏了具体实现,那么这种做法是安全的.当用户能够了

(转)组合优于继承---设计模式之策略模式

文章来源:http://www.javaeye.com/topic/328262 当我们掌握了Java的语法,当我们了解了面向对象的封装.继承.多态等特性,当我们可以用Swing.Servlet.JSP技术构建桌面以及Web应用,不意味着我们可以写出面向对象的程序,不意味着我们可以很好的实现代码复用,弹性维护,不意味着我们可以实现在维护.扩展基础上的代码复用.一把刀,可以使你制敌于无形而于江湖扬名,也可以只是一把利刃而使你切菜平静.Java,就是这把刀,它的威力取决于你使用的方式.当我们陷入无尽

小菜学设计模式——组合模式

背景 很多人学习C语言的时候,都会学习一种很厉害的的算法,递归算法,说实话,递归真的是一个非常厉害的算法,因为它能解决很多意想不到的问题,比如文件夹删除,如果不采用递归,还真不知道要写多少代码呢?关于递归,他总是要一个结束条件,否则就无限循环了,其实这里涉及到结构问题,也就是新的设计模式,组合模式. 1.使用意图 一致对待整体与部分 2.生活实例 组织架构关系,整体与部分可以被一致对待 3.Java 例子(框架.JDK .JEE) 无论是文件还是文件夹,Java都统一使用类File定义,文件夹是

从零开始单排学设计模式「策略模式」黑铁 II

阅读本文大概需要 1.7 分钟. 本篇是设计模式系列的第三篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了,也算是自己的一个回顾吧! 学而时习之,不亦说乎. 推荐阅读: 从零开始单排学设计模式「UML类图」定级赛 从零开始单排学设计模式「简单工厂设计模式」黑铁III 目前段位:黑铁 II Let's Go! 前言 设计模式不是语法,是一种巧妙的写法,能把程序变的更加灵活.架构模式比设计模式大,架构模式是战

图解Java设计模式之组合模式

图解Java设计模式之组合模式 看一个学校院系展示需求 传统方案解决学院院系展示(类图) 传统方案解决学校院系展示存在的问题分析 组合模式基本介绍 组合模式的原理类图 组合模式解决学校院系展示的应用实例 组合模式在JDK集合的源码分析 组合模式的注意事项和细节 看一个学校院系展示需求 编写程序展示一个学校院系结构 :需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系.如图 : 传统方案解决学院院系展示(类图) 传统方案解决学校院系展示存在的问题分析 1)将学院看

组合与继承有什么区别

组合和继承是面向对象中两种代码复用的方式.组合是指在新类里面创建原有类的对象,重复利用已有类的功能.继承是面向对象的主要特性之一,它允许设计人员根据其它类的实现来定义一个类的实现.组合和继承都允许在新的类中设置子对象(subobject),只是组合是显式的,而继承则是隐式的.组合和继承存在着对应关系:组合中的整体类和继承中的子类对应,组合中的局部类和继承中的父类对应. 二者的区别在哪里呢?首先分析一个实例.Car表示汽车对象,Vehicle表示交通工具对象,Tire表示轮胎对象.三者的类关系下图

设计模式之组合模式(Composite)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

组合优于继承

原文地址:http://leihuang.org/2014/11/18/composition-inheritance/ 为什么组合优于继承? 这是一个非常典型的设计模式的问题,Head First Design Pattern第一章好像就讲了,之前看得有点忘了.以下我把stackoverflow上面得分比較高的答案搬过来用一下,我认为这样更easy理解些. 两者差别 Think of composition as a has a relationship. A car "has an"

小故事学设计模式之Decorate: (二)老婆的新衣服

老婆有一件蓝色的裙子和一件粉色的裙子, 不管怎么穿,她还是原来的老婆. 但是在软件里就不一定了, 如果把老婆比作一个class的话, 有一种做法是会因为增加了两个新的Property而继承出两个子类: "穿裙子的老婆, 穿粉色上衣的老婆". 你这样弄出两个子类也没什么不对, 问题是当MM的有上百件服装的时候,就会产生上百个子类,这个不好,将来万一父类一变化,下面上百个子类都要一个个地去修改,太乱了. 有一个更合理的方式来解决这个"老婆的装饰问题".我们的要求是: