Tag: 装饰器

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

代理模式在执行一些额外处理之后将请求委托给Real主题,例如,如果需要处理请求,则应用检查可能是某些凭证检查。 它有如下的类图 Proxy类直接引用具体的Subject。 Decorator Pattern丰富了组件的行为[就像代理它还做了一些额外的处理并将操作委托给真实组件]。 此模式的类图类似于代理模式,唯一的区别是它具有对组件接口的引用。 在Proxy类中具有具体的实际主题使得unit testing变得困难,因为类应该仅依赖于接口而不是实现。 我的问题是,如果代理模式也引用了Real主题公开的接口,那么它将等同于Decorator模式。 在这种情况下,代理模式的类图也将如下所示

Java,Base64:如何使用Decorator Pattern编写Base64OutputStream类

基于我关于RSA和Base64编码的原始问题及其中的注释,我想知道编写Base64OutputStream(或输入流)的最佳方法是什么。 我最初称它为Base64PrintWriter并将其从PrintWriter扩展到将PrintWriter传递给构造函数。 import org.bouncycastle.util.encoders.Base64; public class Base64OutputStream extends FilterOutputStream { public Base64OutputStream(OutputStream out) { super(out); } public void write(byte[] decodedBytes) throws IOException { byte[] base64Message = Base64.encode(decodedBytes); super.write(base64Message); } public void writeln(byte[] decodedBytes) throws IOException { write(decodedBytes); super.write(“\n”.getBytes()); super.flush(); } } 我将原始实现更改为上面的实现,并将其初始化为: Base64OutputStream base64encoder = new Base64OutputStream(socket.getOutputStream()); 我的问题是: 这是一个很好的设计吗? 可以做得更好吗? 我是否正确应用了装饰器图案。 扩展FilteredOutputStream而不是OutputStream是否合适? Oracle表示它很好,但仍有任何缺点或理由仍然从OutputStream扩展? 当我调用构造函数时,我是否应该使用BufferedOutputStream另外装饰它?

使用图像和提示装饰JTextField

我正在尝试用图像和提示创建一些看起来更漂亮的JTextFields。 为此,我做了一个覆盖paintComponent方法的装饰器。 我使用装饰器的原因是我想将它应用于其他类型的JTextField,例如JPasswordField。 这是我到目前为止所做的; 左边的表格中看到的问题是,即使我使用了JPasswordField,paintComponent也似乎忽略了我所假设的密码paintComponent,它可能是密码屏蔽符号。 所以问题是,如何避免重复JTextFields和JPasswordFields的代码,但仍然具有不同的function,如密码屏蔽。 这是装饰器代码; public class JTextFieldHint extends JTextField implements FocusListener{ private JTextField jtf; private Icon icon; private String hint; private Insets dummyInsets; public JTextFieldHint(JTextField jtf, String icon, String hint){ this.jtf = jtf; setIcon(createImageIcon(“icons/”+icon+”.png”,icon)); this.hint = hint; Border border = UIManager.getBorder(“TextField.border”); JTextField dummy = new JTextField(); this.dummyInsets = border.getBorderInsets(dummy); addFocusListener(this); } public […]