<?php

/** ******************************************************
* 策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,
* 从而使得它们可以相互替换。策略模式使得算法可以 在不影响到客户端的情况下发生变化。
* 策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。
* 由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
* *********************************************************
*/ /*
* 数据源保存方式接口 定义了数据源操作的四种基本方式 (增,删,改,查)
*/
interface data_source {
public function add();
public function delete();
public function edit();
public function find();
} /**
* 数据库保存方式具体类
* 具体的数据源接口的一种形式,该形式是把数据保存到数据库
*/
class mysql_datasource implements data_source {
public function add() {
echo 'mysql数据添加';
}
public function delete() {
echo 'mysql数据删除';
}
public function edit() {
echo 'mysql数据修改';
}
public function find() {
echo 'mysql数据查询';
}
}
/**
* oracle保存方式具体类
* 具体的数据源接口的另一种形式,该形式是把数据保存到oracle数据库
*/
class oracle_datasource implements data_source {
public function add() {
echo 'oracle数据添加';
}
public function delete() {
echo 'oracle数据删除';
}
public function edit() {
echo 'oracle数据编辑';
}
public function find() {
echo 'oracle数据查询';
}
} /**
* 文件保存方式具体类
* 具体的数据源接口的另一种形式,该形式是把数据保存到文件
*/
class file_datasource implements data_source {
public function add() {
echo 'file数据添加';
}
public function delete() {
echo 'file数据删除';
}
public function edit() {
echo 'file数据编辑';
}
public function find() {
echo 'file数据查找';
}
} /**
* 策略类
* 该类根据要求返回符合要求类别的的数据源
* 本例 $strategyName = db_source 或者 $strategyName = file_source
*/
class strategy {
public static function getstrategy($data_source) {
return new $data_source ();
}
} /**
* 主体事件处理类
*/
class control {
private $datasource;
public function __construct($datasource) {
$this->datacource = strategy::getstrategy ( $datasource );
}
public function add() {
$this->datacource->add ();
}
public function edit() {
$this->datacource->edit ();
}
public function delete() {
$this->datacource->delete ();
}
public function find() {
$this->datacource->find ();
}
} header ( 'content-type:text/html;charset=utf-8' );
$datasource = "file_datasource";
$concretecontrol = new control ( $datasource );
$concretecontrol->add (); ?>

php设计模式2策略模式的更多相关文章

  1. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  2. PHP设计模式之策略模式

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

  3. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...

  4. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  5. JavaScript设计模式之策略模式

    所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...

  6. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  7. [design-patterns]设计模式之一策略模式

    设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不 ...

  8. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

  9. 设计模式之策略模式和状态模式(strategy pattern & state pattern)

    本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...

  10. python设计模式之策略模式

    每次看到项目中存在大量的if else代码时,都会心生一丝不安全感. 特别是产品给的需求需要添加或者更改一种if条件时,生怕会因为自己的疏忽而使代码天崩地裂,哈哈,本文的目的就是来解决这种不安全感的, ...

随机推荐

  1. 使用libevent进行多线程socket编程demo

    最近要对一个用libevent写的C/C++项目进行修改,要改成多线程的,故做了一些学习和研究. libevent是一个用C语言写的开源的一个库.它对socket编程里的epoll/select等功能 ...

  2. [Data Structure] 二叉搜索树(Binary Search Tree) - 笔记

    1. 二叉搜索树,可以用作字典,或者优先队列. 2. 根节点 root 是树结构里面唯一一个其父节点为空的节点. 3. 二叉树搜索树的属性: 假设 x 是二叉搜索树的一个节点.如果 y 是 x 左子树 ...

  3. 港股street和nominee区别

    股票的street和nominee区别主要用在公司行动的过户费方面,street股票需要收取过户费,nominee不收过户费. street股票通过做公司行动收取过户费后会变成nominee股票,下次 ...

  4. web前端面试试题总结---javascript篇

    JavaScript 介绍js的基本数据类型. Undefined.Null.Boolean.Number.String. ECMAScript 2015 新增:Symbol(创建后独一无二且不可变的 ...

  5. 当多个客户请求一个servlet时,引擎为每个客户启动一个线程,那么servlet类的成员变量被所有的线程共享?

    因为servlet的实现是单例,多线程也就是说,N个客户端请求同一个servlet,他们所请求的是同一个对象,成员变量是属于这个对象的,因此成员变量也被共享了因此在servlet编程中,无状态的ser ...

  6. os即时通讯客户端开发之-mac上安装MySQL

    一.安装 到MySQL官网上http://dev.mysql.com/downloads/mysql/,下载mysql可安装dmg版本 比如:Mac OS X ver. 10.7 (x86, 64-b ...

  7. SpringMVC整合fastjson-1.1.41

    以前用fastjson也只是硬编码,就好像这篇博文写的http://blog.csdn.net/jadyer/article/details/24395015 昨天心血来潮突然想和SpringMVC整 ...

  8. [Redux] Avoiding Array Mutations with concat(), slice(), and ...spread

    For Redux, you cannot use mutable methods like push, splice. Need to use immutable methods such as c ...

  9. C++ TinyXml操作(含源码下载)

      前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手.这个解析库的模型通过解析X ...

  10. java byte数组与int,long,short,byte转换

    public class DataTypeChangeHelper { /** * 将一个单字节的byte转换成32位的int * * @param b * byte * @return conver ...