是门面里面包含了很多其他类的一类?
是什么使它成为一种设计模式?对我来说,这就像一个普通的课程.
你能解释一下这个Facade模式吗?
Facade,Proxy,Adapter和Decorator设计模式有什么区别?
我从来没有读过明确的解释,你的是什么?
我一直在阅读这两个定义,它们似乎完全相同.任何人都可以指出他们的差异是什么?
谢谢
我一直在研究这两种模式之间的区别.
据我所知,facade封装了对子系统的访问,而mediator封装了组件之间的交互.
我知道子系统组件不知道外观,因为组件明显知道中介.
我目前正在使用facade来封装检索配置信息的方法,例如App.Config,存储在SQL中的用户设置,程序集信息等,以及用于在不同窗体之间导航的介体.
但是,大多数网站都指出调解员"增加了功能".这是什么意思?介体如何添加功能?
我对laravel在IOC容器和外墙方面提供的所有好东西感到有些困惑.由于我不是一位经验丰富的程序员,因此学习起来势不可挡.
我想知道,这两个例子有什么区别:
'Foo'的门面并通过容器注册 App::bind()
'Foo'的门面并通过容器注册 App::singleton()
在我的最佳理解Foo::method()中将被重写,$app->make['foo']->method()因为在第一个示例Foo中将创建类的多个实例,并且在第二个示例中,因为它通过a绑定App::singleton(),所以Foo每次调用该对象上的Method时都将返回相同的实例.
如果这个问题的答案显而易见,我很抱歉,但我找不到任何关于这个问题的确认,也没有明确解释.
我读的越多,我就越困惑.
请注意,所有问题都与服务和外观如何适应MVC模式有关.
我的理解是Facade不是一个超级智能对象,它只是一种暴露简单接口/ api来执行复杂操作的方式(例如:执行10 $付款,这是一个复杂的操作,涉及一些操作,但这样的复杂性可以通过一个外观来处理,它只会按特定的顺序调用相应的对象......等等...)
现在,服务是一种执行对几个DAO的调用以获得复杂数据结构的方法(我对此不太确定,但这是我目前所理解的).
那么问题是,外观和服务之间有什么区别?在一天结束时,外观可以完美地访问几个DAO,以便通过提供简单的界面来执行复杂的操作,并且服务似乎类似于某些东西.
交易也是如此,我知道服务是开始交易的地方,但我同样觉得它们也可以放在外墙上,毕竟外立面也可以调用几个DAO.
那么哪个堆栈会更有意义
controller-facade-dao controller-service-dao
或者可能
controller-facadade-dao有时候是controller-facade-service-dao ??
每当我向Eloquent模型添加额外的逻辑时,我最终都必须使它成为一种static方法(即不太理想)才能从模型的外观中调用它.我已经尝试了很多关于如何以正确方式执行此操作的内容,并且几乎所有结果都讨论了创建返回Query Builder接口部分的方法.我试图弄清楚如何添加可以返回任何东西的方法,并使用模型的外观进行调用.
例如,假设我有一个名为的模型,Car并希望得到它们:
$cars = Car::all();
Run Code Online (Sandbox Code Playgroud)
好的,除了现在,假设我想通过make将结果排序为多维数组,所以我的结果可能如下所示:
$cars = array(
'Ford' => array(
'F-150' => '...',
'Escape' => '...',
),
'Honda' => array(
'Accord' => '...',
'Civic' => '...',
),
);
Run Code Online (Sandbox Code Playgroud)
以这个理论为例,我很想创建一个可以被称为的方法:
$cars = Car::getAllSortedByMake();
Run Code Online (Sandbox Code Playgroud)
让我们忘记一下可怕的方法名称以及它与数据结构紧密耦合的事实.如果我在模型中创建这样的方法:
public function getAllSortedByMake()
{
// Process and return resulting array
return array('...');
}
Run Code Online (Sandbox Code Playgroud)
最后在我的控制器中调用它,我将抛出此异常:
非静态方法Car :: getAllSortedByMake()不应该静态调用,假设$ this来自不兼容的上下文
TL; DR:我如何添加有意义的自定义功能,使其成为模型而不使其成为静态方法并使用模型的外观调用它?
这是一个理论上的例子.也许这个问题的改写更有意义.为什么某些非静态方法在Eloquent模型的外观上是可用的,all()或者which()在模型中添加了其他方法?这意味着__call正在使用魔术方法,但是如何让它在模型中识别我自己的函数?
可能比"排序"更好的例子是,如果我需要对一段数据运行计算或算法:
$validSPG = Chemical::isValidSpecificGravity(-1.43);
Run Code Online (Sandbox Code Playgroud)
对我而言,这样的事情在模型中是有道理的,因为它是特定于域的.
我不是在问采访的观点.我想知道在struts框架等项目中实现的实时场景.
我在使用Laravel创建一个Facade模型类时遇到了一些问题.我已经关注了http://laravel.com/docs/facades,但我想我错过了一些东西.
我已经创建了一个app/models名为的文件夹foo.在该文件夹中,我有两个文件.
第一个文件(Foo.php):
<?php
namespace Mynamespace;
class Foo {
public function method() {
}
}
?>
Run Code Online (Sandbox Code Playgroud)
第二个文件(FooFacade.php):
<?php
use Illuminate\Support\Facades\Facade;
class Foo extends Facade {
protected static function getFacadeAccessor() { return 'foo'; }
}
?>
Run Code Online (Sandbox Code Playgroud)
然后我添加Foo => 'Mynamespace\Foo'到aliases数组app/config/app.php并运行composer update和composer dump-autoload.
现在,当我尝试跑步时,Foo::method()我得到了Non-static method Mynamespace\Foo::method() should not be called statically.我究竟做错了什么?