标签:就是 oda 获取数据 wav exception dap function test 访问
要对原有的类的功能进行扩展,但又不希望改变原有类的功能,来适应新的需求,这时候可以从原有类继承,实现一个适配器,这不会改变原有类的功能,又可以添加新的功能.
1.类适配器
class A
{
public function methodA()
{
..............
}
}
class Adapter extends A
{
private $objectA;
public function methodB()
{
echo ‘Append data‘;
}
}
调用:
$a = new Adapter();
$a->methodA();
$a->methodB();
Adapter既扩展了A类,又没有改变A类的功能.为了体现里氏原则,一般继承类不覆盖父类的方法(构造方法除外).再者覆盖了,还不如直接改原来类,适配器也就没意义了.这个模式看起来特别像是普通的继承,
只不过是子类实现了父类中不存在的一些方法.
2.对象适配器:
class A
{
public function methodA()
{
..............
}
}
// 适配器
class Adapter
{
private $objectA;
public function __construct(A $a)
{
$this->$objectA = $a;
}
public function methodA()
{
$this->objectA->methodA();
}
public function methodB()
{
// ....
}
}
//调用
$a = new A();
$adapter = new Adapter($a);
$adapter->methodA();
$adapter->methodB();
对象适配器不使用继承,在构造函数中实例化另一个类.
类适配器和对象适配器的调用方式也有所不同,是否需要构造源类,是两者的区别.
代理设计模式构建了透明置于两个对象之内的一个对象,从而能够截取或代理这两个对象间的通信或访问.
举个例子,之前我们有个CD类,从127.0.0.1上的mysql数据库获取数据;后面因为性能扩展,我们需要该CD类从192.168.2.10上获取数据.使用代理模式来实现:
class CD
{
protected $link = null;
protected static $instance = null;
protected function __construct()
{
$this->connect();
}
public static function getInstance()
{
if (is_null(self::$instance)) {
self::$instance = new static(); //此处注意和new self的区别
}
return self::$instance;
}
public function getAll()
{
$res = $this->link->query("SELECT * FROM cd");
$data = array();
foreach ($res as $row) {
$data[] = $row;
}
return $data;
}
public function connect()
{
if (is_null($this->link)) {
$this->link = new PDO(‘mysql:host=127.0.0.1;dbname=test‘, ‘root‘, ‘root‘);
}
}
public function close()
{
$this->link = null;
}
}
// 代理类
class RemoteCD extends CD
{
public function connect()
{
if (is_null($this->link)) {
try {
$this->link = new PDO(‘mysql:host=192.168.2.10;dbname=test‘, ‘root‘, ‘root‘);
} catch (Exception $e) {
die($e->getMessage());
}
}
}
}
$cd = RemoteCD::getInstance();
var_dump($cd->getAll());
代理设计模式构建了透明置于两个对象之内的一个对象,从而能够截取或代理这两个对象间的通信或访问.
class A
{
public $nameList = array();
public function methodA()
{
$this->nameList[] = ‘peter‘;
}
}
// 装饰器
class Decorator
{
private $objectA;
public function __construct(A $a)
{
$this->objectA = $a;
}
public function toUpper()
{
// 改变了原有对象的内容
foreach($this->objectA->nameList as &$val) {
$val = strtoupper($val);
}
}
}
// 调用
$a = new A();
$decorator = new Decorator($a);
$decorator->toUpper();
var_dump($a->nameList);
ps:代码体现了已有对象的部分内容或功能性发生改变,但是不需要改变原始对象的结构.如果不改变已有对象,可以用适配器.装饰器,必须要装饰一个对象,装饰这个意思就是改变已有对象的内容或功能.
提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类的步骤.
class A
{
public function song($songList)
{
foreach($songList as $val) {
echo $val . ‘.mp3‘;
}
}
}
class B
{
public function song($songList)
{
foreach($songList as $val) {
echo $val . ‘.wav‘;
}
}
}
class Factory
{
public static function create($type, $list)
{
return new $type($list);
}
}
$songList = Factory::create(‘A‘, array(‘a.mp3‘, ‘b.mp3‘));
特点:
工厂模式为拥有相同方法的类提供一个统一的访问实例的接口.
工厂自身并不负责主要数据的处理,全部交由工厂中实例化的类来完成.
标签:就是 oda 获取数据 wav exception dap function test 访问
原文地址:http://www.cnblogs.com/itfenqing/p/7750532.html