代理这种模式提供了一个代理或占位符为另一个对象来控制对它的访问
Proxy(代理)
This class (a) maintains a reference that lets the proxy access the real subject, (b) provides an interface identical(完全相同的) to Subject's so that a proxy can be substituted(['sʌbstitju:tid] 代替) for the real subject, and (c) controls access to the real subject and may be responsible for creating and deleting it.
(这类(a)维护一个引用,让代理访问真正的主题,(b)给主题提供一个完全相同的接口,让一个代理可以代替真正的主题,和(c)控制访问真正的主题,能够负责创建和删除它。)
RealSubject(真对象)
This class defines the...
细粒的有效地这个模式有效地使用共享来支持大量的细粒度对象
Client(客户端)
This class (a) maintains a reference to a flyweight, and (b) computes or stores the extrinsic([ek'strinsik] 外在地) state of flyweight(s).
(这类(a)维护一个轻量级选手的引用,和(b)计算或存储轻量级选手的外在的状态。)
UnsharedConcreteFlyweight(不共享具体享元)
Not all Flyweight subclasses need to be shared. The Flyweight interface enables sharing; it doesn't enforce it.
(并不是所有的轻量级选手子类需要共享。Flyweight接口允许共享;它不强制它。)
ConcreteFlyweight(具体享元)
This class implements the Flyweight i...
封装交互促进松散耦合明确的独立地这种模式定义了一个对象该对象封装了一组对象如何交互中介者使各对象不需要显式地相互引用从而使其耦合松散它允许你独立的改变他们的交互
ConcreteColleague(['kɔli:ɡ] 同事)2
Each colleague class knows its mediator object and communicates(沟通) with its mediator whenever it would have otherwise communicated with another colleague.
(每个同事类知道它的中介对象和与每当它本来与另一位同事沟通都通过与中介沟通来传达。)
ConcreteColleague(['kɔli:ɡ] 同事)1
Each colleague class knows its mediator object and communicates(沟通) with its mediator whenever it would have otherwise communicated w...
对于MyISAM引擎来说,其返回顺序是其物理存储顺序;对于InnoDB引擎来说,其返回顺序是按照主键排序的。
示例:
select uid from table where aid in (4, 3, 5); 主键是uid;
其返回结果不会按照4, 3, 5对应的记录顺序返回,切记,切记...
RESTful API版本控制策略
做RESTful开放平台,一方面其API变动越少, 对API调用者越有利;另一方面,没有人可以预测未来,系统在发展的过程中,不可避免的需要添加新的资源,或者修改现有资源。因此,改动升级必不可少,但是,作为平台开发者,你必须有觉悟:一旦你的API开放出去,有人开始用了,你就不能只管自己Happy了,你对平台的任何改动都需要考虑对当前用户的影响。因此,做开放平台,你从第一个API的设计就需要开始API的版本控制策略问题,API的版本控制策略就像是开放平台和平台用户之间的长期协议,其设计的好坏将直接决定用户是否使用该平台,或者说用户在使用之后是否会因为某次版本升级直接弃用该平台。
版本控制策略模式
API的版本控制策略通常有3种模式:
第一种:The Knot:无版本,即平台的API永远只有一个版本,所有的用户都必须使用最新的API,任何API的修改都会影响到平台所有的用户。甚至平台的整个生态系统。
第二种:Point-to-Point:点对点,即平台的API版本自带版本号,用户根据自己的需求选择使用对应的AP...
进行复杂项目开发时,服务端会把接口拆分的比较细,以方便复用。而拆分后的接口在前端进行组合请求时,通常会出现一个区块要请求多个接口请求才能拿到想要的数据,过多的数据请求会导致区块渲染较慢等问题...
解决方案
1. 在服务端再开发一个新的合并接口来为客户端提供数据
缺点: 该接口可复用性低,不易维护
2. 端在请求时对接口动态合并,后端有一个专门处理合并接口的服务接口
注意: 合并接口需要分发多个请求到不同的接口,然后返回数据给客户端,需要调整接口响应效率
示例:
客户端:
接口
api/combine
参数
apis=[{
url:'users/base',
body:{
type:2
}
},{
url:'users/account',
body:{
id:20
}
}]...
前段时间遇到几道好无聊的面试题,有点类似于脑筋急转弯的感觉。感觉出这几道题的人真是好无聊!
第一题
以下输出结果是什么?
$arr = array(0=>1,"aa"=>2, 3, 4);
foreach($arr as $key=>$val){
print($key == "aa" ? 5 : $val);
}
答案: 5534
分析:
这道题适及到数据类型自动转换, 0 == "aa"结果true。
我的评价:
php弱类型语言,不同的操作符和数据类型之前的转换,有时候会匪夷所思。而且规则一堆,今天记住了,过段时间就忘了。
另外在实际应用中,都是使用全等于===,谁那么无聊会用上题中的==来判断???,即使你很清楚知道转换的规则,你能保证100%不出错吗,===这么安全的未什么不用??
第二题
以下输出结果是什么?
$a = 3;
$b = 5;
if($a = 5 || $b = 7) {...
php5.5有三项的改变比较容易用上,现做以说明,分别是:迭代生成器yield, foreach, finally
yield
提供了一种更容易的方法来实现简单的对象迭代,但没有实现一个具有 Iterator 接口的类所带来的性能开销和复杂性
function nums(){
for($i = 1; $i <= 10; $i += 1) yield $i; } foreach (nums() as $value) { echo $value; }
foreach
php5.5增加了foreach对多维数组循环的功能, 加入了list()函数,请看示例
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b)) {
echo "A: $a; B: $b\n";
}
//返回以下内容
A: 1; B: 2
A: 3; B: 4`&nb...