我怎么知道在我的应用程序开发中需要一个外观模式?
如何在Facade Pattern和Template Pattern之间画线?
例如:在[this]文章中,我们看到,int placeOrder(int CustomerID, List<BasketItem> Products)算法中有许多预定义的步骤.那么作者为什么不在这里使用模板模式呢?
我正准备开始在应用程序中开始性能,最终将分布式运行,但目前正处于[绿地]开发阶段.
我希望能够在没有选择或提交到特定库的情况下引入缓存,所以我想知道是否存在一个已经存在的缓存外观库(类似于slf4j用于日志记录),这将允许我在以后的日子.
我目前正在使用Laravel-4在php中构建一个Web应用程序,但是,我怀疑这个问题也适用于其他语言和框架.
我已阅读有关依赖注入和Facades的信息,并了解每种情况下的必要编码.我不清楚的是你何时应该使用一个而不是另一个?
使用依赖注入而不是Facade设计模式的优点/缺点或原因是什么?
非常感谢
在经典的Facade模式中,单个对象通常为更复杂的东西提供简化的界面.
正如四人帮所说的那样(尽管接近"官方"......):
Facade(185)为子系统中的一组接口提供统一接口.Facade定义了一个更高级别的接口,使子系统更易于使用.
和
...一个外观只是抽象出子系统对象的接口,使它们更容易使用; 它没有定义任何新功能,子系统类也不知道它.
或者,正如Unmesh将其放在/sf/answers/366973351/中:
Facade保护用户免受系统的复杂细节的影响,并为他们提供易于使用的简化视图.它还将使用系统的代码与子系统的细节分离,使以后更容易修改系统.
单一责任原则告诉我们
一个类或模块应该只有一个改变的理由.
Per Bob叔叔(http://en.m.wikipedia.org/wiki/Single_responsibility_principle)
鉴于Facade在设计上可以保护用户免受众多"改变的原因"的影响,这两个想法如何协同工作?Facade是否有与其实现所依赖的子系统数量一样多的理由进行更改?
oop design-patterns single-responsibility-principle facade solid-principles
在我的应用程序中,我曾经使用它们作为控制器在主应用程序中调用Facade方法,因为我认为它们是相同的,但现在我认为我错了.
我的应用程序使用多个Facade,每个Facade用于一种任务.如果我改为使用Controller,正确的方法是只有一个控制器?
我的问题是Facade和Controller之间的区别是什么.
language-agnostic model-view-controller design-patterns controller facade
我有一个Str::random()我想测试的类。
但是当我Str::shouldReceive('random')在我的测试中使用时,我得到一个 BadMethodCallException 说该方法 shouldReceive 不存在。
我还尝试直接模拟该类并将其绑定到 IOC,但它一直在执行原始类,生成一个随机字符串而不是我在模拟上设置的返回值。
$stringHelper = Mockery::mock('Illuminate\Support\Str');
$this->app->instance('Illuminate\Support\Str', $stringHelper);
//$this->app->instance('Str', $stringHelper);
$stringHelper->shouldReceive('random')->once()->andReturn('some password');
//Str::shouldReceive('random')->once()->andReturn('some password');
Run Code Online (Sandbox Code Playgroud) 我有一个演示类通常通过
$this->app->bind('demo', function() { return new Demo(); }
一个立面
受保护的静态函数 getFacadeAccessor() { return 'demo'; }
类本身看起来像这样
课堂演示
{
私人 $value1;
私人 $value2;
公共函数 setVal1($value)
{
$this->value1 = $value;
}
公共函数 setVal2($value)
{
$this->value2 = $value;
}
公共函数 getVals()
{
返回 'Val 1:' 。$this->value1 。'瓦尔2:'。$this->value2;
}
}
有人告诉我,如果我在这个类上使用 Facade,Laravel 将实例化该类的一个对象,然后调用该对象上的方法,例如:
$app->make['demo']->setVal1();
Run Code Online (Sandbox Code Playgroud)
Butt 我测试了更多,发现这种非常奇怪(至少对我而言)的行为:
如果我做
演示::setVal1('13654'); 和
演示::setVal2('随机字符串')
我不应该使用 Demo::getVals() 来检索我刚刚创建的值,对吗?由于每次使用外观方法时都会实例化一个新对象,一个对象如何检索另一个对象的属性?应该有三个不同的实例,但我仍然能够从其他实例中检索属性......
我认为这只有在将类与 App::singleton 绑定而不是通过 App::bind 绑定时才有可能?
Symfony2 新手,我正在构建一个使用外部 API 来获取数据的应用程序。我创建了很多客户端类来从 API 检索和转换每个实体,并将这些类定义为服务 - 例如,我有一个像orFooClient之类的 with 方法,它从 API 返回数据。getAll()getThoseThatInterestMe($me)
现在我想创建一个ApiClientFacade类,它充当所有类前面的接口XxxClient,遵循外观模式- 例如,这个外观类将有一个方法getAllFoo(),而该方法又会调用FooClient::getAll(),依此类推......
我也可以将我的外观类定义为服务,但它有太多的依赖项 - 我有大约 30 个客户端类。另外,据我所知,使用这种方法我每次都会加载所有 30 个依赖项,而大多数时候我只需要一个依赖项......
那么,有更好的方法吗?
我已经被这个问题困扰了一段时间了,这确实困扰了我,所以我想我应该问一下。在 Laravel 中,它们如何允许访问具有两个命名空间的外观?如果你不明白我的意思,这里有一个例子。使用会话外观时,以下两个语句都将起作用:
use Session;
use Illuminate\Support\Facades\Session;
Run Code Online (Sandbox Code Playgroud)
我在网上进行了搜索,但仍然没有找到这个问题的答案。
谢谢你的帮助!
我认为Retrofit使用的是Facade设计模式
facade ×10
laravel ×3
php ×3
android ×1
caching ×1
controller ×1
dependencies ×1
java ×1
laravel-4 ×1
mockery ×1
namespaces ×1
oop ×1
retrofit ×1
retrofit2 ×1
service ×1
single-responsibility-principle ×1
symfony ×1
unit-testing ×1