我花了一些时间在维基百科的这个Bridge模式示例中,但是,我仍然不明白这个桥模式试图解释什么.
interface DrawingAPI { public void drawCircle(double x, double y, double radius); } /** "ConcreteImplementor" 1/2 */ class DrawingAPI1 implements DrawingAPI { public void drawCircle(double x, double y, double radius) { System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius); } } /** "ConcreteImplementor" 2/2 */ class DrawingAPI2 implements DrawingAPI { public void drawCircle(double x, double y, double radius) { System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius); } } /** "Abstraction" */ interface Shape { public void draw(); …
在设计模式 - 可重用面向对象软件的元素书中说:
在只有一个实现(一对一)的情况下,创建一个抽象的实现者类是没有必要的.这是桥模式的退化情况; Abstraction和Implementor之间存在一对一的关系.然而,当类的实现中的更改不得影响其现有客户端时,这种分离仍然有用 - 即它们不应该被重新编译,只需重新链接.
我对编译时间的好处表示怀疑,因为我无法想象Java中的一个案例,即实现中的更改会重新编译其超类(在本例中为abstract).
例如,如果我们有X扩展Y并且客户端执行:
Y y = new X();
Run Code Online (Sandbox Code Playgroud)
X中的更改并不意味着重新编译Y(当然,如果我们不想更改X的方法签名)
使用Bridge Pattern时完全相同:
YAbstraction yabstraction = new YRefinedAbstraction(new XImplementor());
Run Code Online (Sandbox Code Playgroud)
XImplementor中的更改并不意味着重新编译YAbstraction.
因此,根据我的说法,这种好处不会发生在Java中,并且需要一对一=>无桥模式.
也许子类强制超类的更改要在其他语言中重新编译?喜欢SmallTalk和C++?
你有什么看法?
我正确地看不到桥模式:
之前:
public class Main2 {
@SuppressWarnings("unused")
public static void main(String[] args) {
Car car11 = new BadNativeCar();
Car car12 = new GoodNativeCar();
Car car21 = new BadForeignCar();
Car car22 = new GoodForeignCar();
}
}
interface Car{
public void drive();
public void stop();
}
class NativeCar implements Car{
@Override
public void drive() {
}
@Override
public void stop() {
}
}
class ForeignCar implements Car{
@Override
public void drive() {
}
@Override
public void stop() {
}
}
class GoodNativeCar …
Run Code Online (Sandbox Code Playgroud) 我使用Symfony 3.3.10
上PHP 7.0.25-0ubuntu0.16.04.1
默认情况下,此组合与phpunit 5.x
.
但我想用力phpunit 6.x
。
当我vendor/bin/simple-phpunit
第一次调用时,它会按照此处的源代码中的说明安装phpunit/phpunit
版本5.7.*
:
https://github.com/symfony/phpunit-bridge/blob/v3.4.11/bin/simple-phpunit
第 18-27 行:
if (PHP_VERSION_ID >= 70200) {
// PHPUnit 6 is required for PHP 7.2+
$PHPUNIT_VERSION = getenv('SYMFONY_PHPUNIT_VERSION') ?: '6.5';
} elseif (PHP_VERSION_ID >= 50600) {
// PHPUnit 4 does not support PHP 7
$PHPUNIT_VERSION = getenv('SYMFONY_PHPUNIT_VERSION') ?: '5.7';
} else {
// PHPUnit 5.1 requires PHP 5.6+
$PHPUNIT_VERSION = '4.8';
}
Run Code Online (Sandbox Code Playgroud)
因为我的 PHP 版本是 …
我试图解决一个基本上减少的问题:
给出一组N个节点,编号从1到N和M个边缘,其中N <10000和M <100000,
找到边缘(u,v),当添加到图形时- 最小化图表中的桥梁数量.
如果有许多这样的边缘 - 打印具有最低字典值的那个边缘.
什么是解决这个问题的有效方法?
问题
我花了几个小时试图确定我的分布式代码失败的原因,但是在使用IDE(NetBeans)调试时我的源代码没有问题.我找到了一个解决方案,并发帖帮助其他可能有类似问题的人.顺便说一句:我是一个自学成才的程序员,可能会缺少一些基本概念 - 随时教育我.
背景资料
在JavaFX应用程序中使用WebView控件我从html文件加载网页.我想使用JavaScript来处理HTML方面,但我还需要在Java和JavaScript之间自由传递信息(两个方向).非常适合使用WebEngine.executeScript()方法进行Java启动的传输,并使用Java中的JSObject.setMember()为JavaScript启动向Java传输信息的方法.
设置链接(这种方式稍后会破坏):
/*Simple example class that gives method for
JavaScript to send text to Java debugger console*/
public static class JavaLink {
public void showMsg(String msg) {
System.out.println(msg);
}
}
...
/*This can be added in the initialize() method of
the FXML controller with a reference to the WebEngine*/
public void initialize(URL url, ResourceBundle rb) {
webE = webView.getEngine();
//Retrieve a reference to the JavaScript window object
JSObject jsObj = (JSObject)webE.executeScript("window");
jsObj.setMember("javaLink", new JavaLink());
/*Now …
Run Code Online (Sandbox Code Playgroud) 我有一个 docker 链接到一个具有 IP 地址的网桥192.168.150.1/24
。一旦我从 docker 映像创建了 docker 实例,它就会获得一个 IP 地址,192.168.150.2
但根据我的要求192.168.150.2
,必须保留这个 IP 地址,因为我想将它用于其他用途。
现在,我想将此 docker 实例的 IP 地址更改为192.168.150.3
. 有可能吗?如果是这样怎么办?请帮忙。
我对 KVM 和桥接完全陌生,需要你的帮助。我有一个带有 QEMU/KVM 的远程服务器,并且只能使用 SSH 连接。主机操作系统是 RHEL 7。来宾必须连接到网桥(ovs),他们可以看到对方并且无法访问外部网络。主机必须能够对访客执行 ping 操作。不得使用物理 NIC 接口,因为我可能会失去连接。所以这就像主机看到访客的每个虚拟接口并可以访问它们,并且访客通过桥接器看到彼此。我使用 libvirt 尝试按照How to Use Open vSwitch with Libvirt 的说明来配置它。请帮帮我。
首先我需要的是创建桥梁:
sudo ovs-vsctl add-br ovsbr
Run Code Online (Sandbox Code Playgroud)
然后我使用 virsh 配置域 XML 文件,如下所示:
<interface type='bridge'>
<mac address='52:54:00:71:b1:b6'/>
<source bridge='ovsbr'/>
<virtualport type='openvswitch'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
Run Code Online (Sandbox Code Playgroud)
重新启动后,域桥已连接 vnet0 接口,该接口是来宾接口。在这种情况下如何提供寻址?我可以通过主机向访客提供静态地址吗?
精简版:
如何将std::string
(使用桥接从 .Swift 文件调用的 .cpp 函数返回的对象)转换为 Swift String
?
长版:
我有一个用 C++ 编写的库,我必须使用 Swift 调用一些代码。我创建了一个桥,在我的 Xcode 项目中添加了两个文件:
一个桥接头,它允许 Swift 调用 C 函数(afaik Swift 不能直接调用 C++ 函数,所以它需要通过 C 函数)
//file bridgingHeader.h
const char * getLastOpenedFile();
Run Code Online (Sandbox Code Playgroud)
和一个 .cpp 文件,它可以在内部调用(当然)C++ 函数,并且可以用 extern "C" 定义 C 函数
//file wrapper.cpp
#include <string>
#include "my_library.hpp"
extern "C" const char * getStringFromLibrary()
{
const char * s = get_string_from_library().c_str();
return s;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用 .swift 文件访问返回值
let myString = String(cString: getStringFromLibrary())
Swift.print(myString)
Run Code Online (Sandbox Code Playgroud)
放置断点检查s
函数内部的值getStringFromLibrary() …
我正在运行一个启用了“userns-remap”的dockerized GitLab 实例,并且我想在主机上使用共享的 PostgreSQL。然而,当我 docker-compose up 时创建的桥在每次运行时都会获得一个新的随机名称“br-xxxxxxxxxxxx”。
这通常不会成为问题,但主机上的 Vuurmuur 防火墙默认会阻止从容器到主机的所有流量,并且我需要网桥名称才能在 Vuurmuur 上设置允许规则。
我发现了一些相关的主题,例如com.docker.network.bridge.name
,但我很难将它们放在一起。到目前为止,我试图找到一种方法来确保每次容器升级时,网桥都会分配相同的名称和相同的 IP/掩码。这是否可能,docker-compose.yml
或者这种方法是完全错误的吗?
docker-compose.yml
到目前为止,这是不引人注目的:
version: '3.8'
services:
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_host'] = '172.18.0.1'
(...)
ports:
- '8080:80'
volumes:
(...)
Run Code Online (Sandbox Code Playgroud)
感谢您的任何提示!
bridge ×10
java ×3
c++ ×2
docker ×2
algorithm ×1
compilation ×1
composer-php ×1
graph ×1
ip ×1
jar ×1
javafx ×1
javascript ×1
jsobject ×1
kvm ×1
libvirt ×1
networking ×1
phpunit ×1
swift ×1
symfony ×1
version ×1