一点背景:我们正在建立一个与科学模型合作的图书馆/框架.我们有一个接口Model,它定义了模型必须实现的操作,这是非常小的.即:Model界面从模型实现者的角度定义模型的契约.
该框架增加了大量的模型周围的其他的功能,但现在的客户端代码有使用一堆其他类,如访问功能ModelInfo,ModelHost,ModelInstance,等.
在我们使用这个框架的应用程序中,我们不希望实际上必须处理运行模型等所有这些机制.所以我们决定使用façade模式将框架功能包装在一个易于使用的框架中.使用对象.(我们已经将这种模式应用到框架的其他部分,并取得了很好的成功.)
这是一个问题:假设我们已经有了一个接口Model,那么façade类的名字是什么? 该Model界面框架和之间的合同模型实现,以及新的类将定义框架和之间的合同客户端应用程序.
或者,更一般地说:当我们有一个库或框架提供的抽象时,我们如何命名抽象的"双方",以便清楚地识别抽象的"提供者"和"消费者"接口?
(如果重要的是,对于这个项目,我们使用的是Java 6.)
我查看了维基百科的文章,似乎它缺少代码示例的c ++版本.如果没有这个,我无法完全理解Facade模式,你能用C++帮我解释一下吗?
我真的不明白外立面的意义.
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public void edit(T entity) {
getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] range) {
CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0]); …Run Code Online (Sandbox Code Playgroud) 我找到了一篇旧帖子,但没有说明我对Wrapper Classes使用的设计模式的理解,而且,从维基百科阅读时我没有得到任何明确的信息.
包装类是否真的使用任何设计模式?
如果使用模式,那么其模式是它的这些:Decorator Pattern,Facade Pattern或Adapter Pattern?
我想问一下访问EJB会话Bean时使用Facade Pattern的原因是什么.在我的Netbeans 6.9.1,如果我做New> Sessions Bean for Entity Classes,让说,我选择User实体,然后Netbeans的会看到这个代码
AbstractFacade.java
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public T edit(T entity) {
return getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] …Run Code Online (Sandbox Code Playgroud) laravel 5.2 File与Storage外墙之间是否有任何差异?
看起来他们都使用相同的合同.我File在laravel文档中看不到任何文档.如果它们不同,它们之间可能相互影响?
我一直试图找出在Laravel中设置服务提供商时的区别app->bind和app->singleton区别.我的印象是,如果我注册singleton它,每次调用它时都会返回相同的对象实例,bind这将是一个新实例.
这是一个简单的例子:
正面:
use Illuminate\Support\Facades\Facade;
class DataFacade extends Facade
{
protected static function getFacadeAccessor() {
return 'Data';
}
}
Run Code Online (Sandbox Code Playgroud)
服务提供者:
use Illuminate\Support\ServiceProvider;
class DataServiceProvider extends ServiceProvider
{
public function register() {
$this->app->singleton('Data', function() {
return new Data;
});
}
}
Run Code Online (Sandbox Code Playgroud)
类:
class Data
{
public $data = [];
public function get($key)
{
return isset($this->data[$key]) ? $this->data[$key] : null;
}
public function set($key, $val)
{
$this->data[$key] = $val;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们做类似的事情:
$instance = …Run Code Online (Sandbox Code Playgroud) 根据Laravel 文档,我应该能够通过 模拟外观Object::shouldReceive(),但是当我这样做时,它说我无法重新声明该方法。当我在浏览器中查看该视图时,该视图可以正常工作,我只需要弄清楚如何正确测试它。
Cannot redeclare Mockery_1_Facades_MyService::shouldReceive() in /path-to-project/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php(16) : eval()'d code on line 672
这是我的测试:
public function testSend()
{
MessageService::shouldReceive('find')->once()->with(1);
$this->call('GET', '/message/1/send');
$this->assertRedirectedToRoute('message.index');
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
public function send($id)
{
$message = MessageService::find($id);
$this->messageService->sendBroadcast($message);
return Redirect::route('message.index')
->with('message', "Sending message: {$message->name}, stand by...");
}
Run Code Online (Sandbox Code Playgroud) 我有symfony项目,在这个项目中,我有很大的自己的服务,它庞大而复杂,有自己的依赖项等......我想为这个服务创建外观,目的是使用我的服务controllers:
$myService = $this->container->get('service_from_my_domain');
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在我的门面内部访问container服务的依赖项。我只知道一种方法 - 是在 yaml 配置中将依赖注入到服务中。
但是还有其他方法可以做到吗?喜欢:
$dependency = Container::getInstance()->get('my_dependency_service');
Run Code Online (Sandbox Code Playgroud)
我找到了这个答案,但是使用全局变量感觉就像回到了过去......
PS:我不想通过 yaml 配置(不是构造函数注入或 setter 注入)注入依赖项,因为我在这里不需要 IoC(控制反转)。
是否真的不可能在jar文件中隐藏某些类?
我希望不允许直接实例化类以使其更灵活.这个罐子里只能看到工厂(或立面).
除了创建两个项目之外,还有其他办法解决这个问题吗?(两个项目:第一个包含类(实现),另一个引用第一个并包含工厂;后面只引用第二个)