面向对象之开闭原则

转自:http://my.oschina.net/shyl/blog/531605

要做个php的数据接口,返回xml格式的数据。

class Data{

    private $_data = array();
    public function __construct( $data ){
        $this -> data = $data;
    }

    public function formatXml( $data ){
        $xml = ‘<?xml version="1.0" encoding="utf-8"?>‘;
        $xml .= ‘<return>‘;
        $xml .= ‘<data>‘ .serialize($return_data). ‘</data>‘;
        $xml .= ‘</return>‘;
        return $xml;
    }

    //返回xml数据
    public function getXml(){
       // 怎样把数据处理成xml就不写了
        return $this -> formatXml($this -> _data);
    }

}

$data = new Data( array(‘title‘ => ‘Strategy‘, ‘language‘ => ‘PHP‘)  );
echo $data -> getXml();

那么问题来了,我需求要变了,这次要返回个JSON格式的,我该怎么处理呢?最简单的方法,在Data类里面再加入个getJson方法。问题虽然解决了,但记不记得我们之前讲的设计模式原则,对的,他违反了开闭原则。对扩展开放,对修改关闭。Data类的作用太复杂了,违反了单一职责原则。那么我们就要想办法了。

class Data{
    private $_data = array();
    public function __construct( $data ){
        $this -> _data = $data;
    }

    //
    public function getData( IFormat $format ){
        $format -> formatData( $this -> _data );
    }
}

interface IFormat{
    public function formatData();
}

class Json implements IFormat{

    public function formatData( $data ){
        return json_encode( $data );
    }
}

class Xml implements IFormat{

    public function formatData( $data ){
        $xml = ‘<?xml version="1.0" encoding="utf-8"?>‘;
        $xml .= ‘<return>‘;
        $xml .= ‘<data>‘ .serialize($return_data). ‘</data>‘;
        $xml .= ‘</return>‘;
        return $xml;
    }
}

$data = new Data( array(‘title‘ => ‘Strategy‘, ‘language‘ => ‘PHP‘) )
$data -> getData( new Json() );  //获取Json格式
$data -> getData( new Xml() );  //获取xml格式
时间: 2024-10-13 03:40:16

面向对象之开闭原则的相关文章

Python:面向对象的“开闭原则”和“鸭子类型”

开闭原则 开闭原则(OCP)是面向对象设计中"可复用设计"的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段. 1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作<面向对象软件构造(Object Oriented Software Construction)>中提出了开闭原则,它的原文是这样:"Software entities should be open for extension,but closed fo

面向对象设计原则之开闭原则

http://blog.csdn.net/lovelion/article/details/7537584 为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键.在Java.C#等编程语言中,可以为系统定义一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成.在很多面向对象编程语言中都提供了接口.抽象类等机制,可以通过它们定义系统的抽象层,再通过具体类来进行扩展.如果需要修改系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有

面向对象五大原则_基石_开闭原则

1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作<面向对象软件构造(Object Oriented Software Construction)>中提出了开闭原则,它的原文是这样:"Software entities should be open for extension,but closed for modification". 翻译过来就是:"软件实体应当对扩展开放.对改动关闭". 这句话说得稍微有点专业,我们把它讲得更通俗一点,

day03_面向对象五大原则_基石_开闭原则

1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作<面向对象软件构造(Object Oriented Software Construction)>中提出了开闭原则,它的原文是这样:"Software entities should be open for extension,but closed for modification".翻译过来就是:"软件实体应当对扩展开放,对修改关闭".这句话说得略微有点专业,我们把它讲得更通俗一点,也就

面向对象的基本原则(二)------开闭原则

一.定义 开闭原则(OCP),英文全称是Open for extention, Closed for modification Principle,即对扩展开放,对修改关闭原则.该原则的思想是,可以通过扩展来满足变化,而不需要修改代码,或者说在设计一个模块的时候,应当使这 个模块可以在不被修改的前提下被扩展. 二.实现 实现开闭原则的关键是抽象,抽象是面向对象设计的一个核心特征. 对一个事物抽象化,实质上是在概括归纳总结它的本质.抽象让我们抓住最最重要的东西,从更高一层去思考,这降低了思考的复杂

面向对象原则之一 开放封闭原则(开闭原则)

原文:面向对象原则之一 开放封闭原则(开闭原则) 前言 面向对象有人分为五大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则. 也有人分为六大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则.迪米特法则. 现在我们来介绍开放封闭原则,也叫开闭原则 开闭原则 1)概念 官方说法是 软件实体(模块.类.函数等)应该可以扩展,但是不可以修改.也就是说软件对扩展开放,对修改关闭. 需要说明的是,对修改关闭不是说软件设计不能做修改,只是尽量不

开闭原则——面向对象设计原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本.我们将在下面的几节中依次来介绍这 7 条原则,本节首先介绍开闭原则. 开闭原则的定义 开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作<面向对象软件构造>(Object Oriented Software Construction)中提出

开闭原则——面向对象程序设计原则

目录 前言 开闭原则定义 开闭原则作用 开闭原则案例 1. 描述 2. uml 图 3. 具体代码 前言 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本.我们将在下面的几节中依次来介绍这 7 条原则,本节首先介绍开闭原则. 开闭原则定义 开闭原则规定"软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的",这意味着一个实体是允许在不改变它的源

第2章 面向对象的设计原则(SOLID):6_开闭原则

6. 开闭原则(Open Closed Principle,OCP) 6.1 定义 (1)一个类应该对扩展开放,对修改关闭.要求通过扩展来实现变化,而且是在不修改己有的代码情况下进行扩展,也不必改动己有的源代码或二进制代码. (2)在软件生命周期内,变化是一个既定的事实,在设计时尽量适应这些变化,以提高项止的稳定性和灵活性,真正实现“拥抱变化”.而开闭原则告诉我们要通过扩展来实现这些变化而不是修改原来代码. (3)修改关闭,并不意味着软件不做任何的改动,低层模块的变更,必然要高层模块进行耦合,否