标签: proxy-pattern

代理模式和适配器模式之间的差异?

似乎Proxy和Adapter模式之间有相似之处?

任何人都可以解释一下有什么区别吗?为什么我们要求他们两个?在哪些问题中我们应该只使用代理而不是另一个.net示例?

谢谢

.net design-patterns adapter proxy-pattern

5
推荐指数
2
解决办法
5757
查看次数

如何准确地工作基于 Spring 继承的代理配置?

我正在学习 Spring Core 认证,我发现一些与代理概念相关的疑问。

所以在学习材料上,我找到了以下测验:

有一个 Java配置类,其中包含以下方法:

@Bean
public AccountRepository accountRepository(){ 
    return new JdbcAccountRepository(); 
}

@Bean
public TransferService transferService1() {
    TransferServiceImpl service = new TransferServiceImpl();
    service.setAccountRepository(accountRepository());
    return service;
}

@Bean
public TransferService transferService2() {
    return new TransferServiceImpl( new JdbcAccountRepository() );
}
Run Code Online (Sandbox Code Playgroud)

如您所见,transferService()有两种不同的实现,分别命名为transferService1()transferService2(),它们创建并返回TransferServiceImpl对象。

第一个创建一个新的TransferServiceImpl对象,然后对其调用setAccountRepository()方法。

第二个只是创建一个TransferServiceImpl将一个新的JdbcAccountRepository对象传递给它的构造函数。

它问我**前两种方法的最佳实现是什么?

提供的答案是:首选调用专用方法。所以我认为它说最好的方法是第一个实现。

它解释说AccountRepository bean 是一个单例(因为它是 Spring 中 bean 的标准范围)但是JdbcAccountRepository()可以被调用两次或更多次(例如在前面的代码片段中,它在调用方法时被调用 …

java spring design-patterns proxy-pattern applicationcontext

5
推荐指数
1
解决办法
705
查看次数

重载 -> 运算符通过代理转发成员访问

我正在尝试将 Python 包装PyObject*在一个Object类中。在 Python 中,一切都是PyObject*. 列表是 a PyObject*,列表中的每一项本身就是 a PyObject*。这甚至可能是另一个列表。等等。

我试图fooList[42] = barObj通过代理模式(here)来允许样式语法。

现在我已经可以工作了,我想扩展它,以便fooList[42]可以将其用作Object. 具体来说,我希望能够处理...

fooList[42].myObjMethod()
fooList[42].myObjMember = ...
Run Code Online (Sandbox Code Playgroud)

Object有很多方法,目前fooList[42].myObjMethod()将首先解析fooList[42]为一个Proxy实例,比如tmpProxy,然后尝试tmpProxy.myObjMethod()

这意味着我将不得不做

void Proxy::myObjMethod(){ return wrapped_ob.myObjMethod(); }
Run Code Online (Sandbox Code Playgroud)

即通过 手动中继每个Object方法Proxy,这很丑陋。

我看不到任何完美的解决方案(请参阅上面链接的答案),但我很乐意使用:

fooList[42]->myObjMethod()
Run Code Online (Sandbox Code Playgroud)

... 作为妥协,将 as -> 视为可以重载(而不是.不能)。

但是,我找不到任何有关重载的文档operator->

我最好的猜测是它必须返回一个指向某个对象的指针(比如pObj),而 C++ 将调用pObj->whatever. …

c++ operator-overloading proxy-pattern c++11

5
推荐指数
1
解决办法
1056
查看次数

使用Swift的代理对象

我正在尝试使用swift实现代理模式,以便为从NSObject继承的自定义对象创建配置对象.这对于UIView来说就像UIAppearance.但我不明白如何进行方法调用转发,我会在Objective-c中使用forwardInvocation:方法和NSInvocation类进行.

如果有人遇到这样的问题并找到解决方案,我会很感激.提前致谢.

proxy-pattern ios swift

5
推荐指数
0
解决办法
627
查看次数

如果在代理模式中我们有接口而不是代理类中的实际具体主题,则它等效于装饰器模式

代理模式在进行了一些其他处理(例如应用检查是否需要处理请求还是基于某些凭据检查)之后,将请求委托给Real主题。

它的类图如下

在此处输入图片说明

代理类直接引用了具体的Subject。

装饰器模式丰富了组件的行为(像代理一样,它也进行一些附加处理并将操作委托给实际组件)。此模式的类图类似于Proxy模式,唯一的区别是它具有对组件接口的引用。

在此处输入图片说明

在Proxy类中拥有具体的实际主题会使单元测试变得困难,因为类仅应依赖于接口而不是依赖于实现。我的问题是,如果代理模式也引用了Real主体公开的接口,那么它将等同于Decorator模式。在这种情况下,代理模式的类图也将如下所示

在此处输入图片说明

java design-patterns decorator proxy-pattern

5
推荐指数
1
解决办法
376
查看次数

如何在Kotlin通用代码中创建动态代理?

如果我在 JVM 上,我可以这样做:

object Playground {

    class DynamicInvocationHandler : InvocationHandler {

        @Throws(Throwable::class)
        override operator fun invoke(proxy: Any, method: Method, args: Array<Any>): Any {
            LOGGER.info("Invoked method: {}", method.name)

            return 42
        }

        companion object {

            private val LOGGER = LoggerFactory.getLogger(
                    DynamicInvocationHandler::class.java)
        }
    }

    @JvmStatic
    fun main(args: Array<String>) {
        val proxy = Proxy.newProxyInstance(
                Playground::class.java.classLoader,
                arrayOf<Class<*>>(MutableMap::class.java),
                DynamicInvocationHandler()) as MutableMap<String, String>

        proxy["foo"] = "bar"
    }
}
Run Code Online (Sandbox Code Playgroud)

运行此命令将打印Invoked method: put. 我怎样才能在 Kotlin公共项目中做这样的事情?

编辑:我不想在我的公共模块中使用 Java 中的任何内容。我知道常见项目是如何运作的。我感兴趣的是是否有基于 Kotlin 的解决方案。

编辑2:我不想代理该类Map。我正在寻找类似Proxy …

proxy-pattern kotlin kotlin-multiplatform

5
推荐指数
1
解决办法
9061
查看次数

什么是new()函数?

我一直在学习设计模式,我从类中看到了这样一个方法调用:

class Client: SubjectAccessor {
    static void Main() {
        Console.WriteLine("Proxy Pattern\n");

        ISubject subject = new Proxy();
        Console.WriteLine(subject.Requesy());

        subject = new(); //Here is what I am asking
        COnsole.WriteLine(subject.Request());
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以看到那里有一个subject = new();电话,我想知道它是否正在创建一个新的实例Proxy或其他东西.我没有发现任何与此相关的内容.

非常感谢您的帮助.

如果你需要,我可以粘贴整个代码或实际上它写在书上,所以我需要在这里写下来.

谢谢.

c# design-patterns proxy-pattern

4
推荐指数
1
解决办法
259
查看次数

JAVA EE代理模式

我一直在阅读,当你要求在bean中注入依赖项时,你会向该资源的一个实例注入一个代理.我相信我知道代理是什么,它是一个知道如何将消息转发到另一个实例的实例.它还声明,正是这种模式允许容器为这个托管bean提供服务.

我不太了解这一点.为什么需要代理?这是如何实现的?每个bean都有一个代理对象吗?或者我有很多代理转发到一个实例?或者两者都不是?

另外,根据GoF的书籍设计模式,我已经读过你必须提供一个充当占位符的代理类.但我从来没有在Java EE中这样做,应用服务器是否在运行时创建代理类?

dependency-injection java-ee cdi proxy-pattern

3
推荐指数
1
解决办法
1659
查看次数

`Proxy` 混淆了 `this[toString]` 和 `this[Symbol.toStringTag]`

它只发生在#toString, 并且只有当我(尝试)通过missingMethod-like访问它时trap

我有一个工厂createIterface,它返回一个Proxy具有大量方法的对象。在这些方法中,我有#toString()#id()#id返回interface与调用者具有相同属性的 并且工作正常;#toString应该将 my 转换interface为字符串,但它失败了。Allinterface的方法——包括#id#toString——都在一个#Symbol.for("__methods")属性中。我这样做是为了调试的目的:

const __methods = Symbol.for("__methods");

const missingMethod = ({
    get: (obj, prop) => Reflect.has(obj, prop)
        ? Reflect.get(obj, prop)
        : Reflect.has(obj[__methods], prop)
            ? Reflect.get(obj[__methods], prop)
            : console.log(`No #${prop} property exists.`)
});

const createInterface = (...props) => new Proxy({
    ...props,
    [__methods]: {
        id: () => createInterface (...props), …
Run Code Online (Sandbox Code Playgroud)

javascript symbols google-chrome tostring proxy-pattern

3
推荐指数
1
解决办法
353
查看次数

Python代理类

我正在尝试为另一个类创建一个Proxy类.我希望这个类在其构造函数中传递给代理,然后让代理动态地创建此类的所有相同方法.

这是我到目前为止无法正常工作的原因:

import inspect
from optparse import OptionParser

class MyClass:

    def func1(self):
        print 'MyClass.func1'


    def func2(self):
        print 'MyClass.func1'


class ProxyClass:

    def __init__(self):
        myClass = MyClass()
        members = inspect.getmembers(MyClass, predicate=inspect.ismethod)
        for member in members:
            funcName = member[0]
            def fn(self):
                print 'ProxyClass.' + funcName
                return myClass[funcName]()
            self.__dict__[funcName] = fn

proxyClass = ProxyClass()
proxyClass.func1()
proxyClass.func2()
Run Code Online (Sandbox Code Playgroud)

我认为这是self.__dict__[funcName] = fn需要改变的线,但我不知道该怎么做?

我是Python的新手,所以如果有一种完全不同的Pythonic方式,我也很乐意听到这个.

python proxy-pattern

2
推荐指数
1
解决办法
800
查看次数