java设计模式--结构模式

亨元  Flyweight
    JDK 中如:String 类。  可以共享的对象使用同一个对象,这样就节省的内存空间。


桥接 Bridge  
    将抽象部分与行为部分分离,使它们都可以独立地变化。
    举例说明:“人”是一种抽象,如人可以分为“男人”、“女人”;人也行为,如“奔跑”,但是如果是别的动物也有“奔跑”这个行为,所以不能把“奔跑”这个行为抽象到“人”这个抽象中(即抽象和行为绑定),如果“抽象和行为绑定”,行为再抽象出“飞行”那么就要再增加类:“男人飞行”,“女人飞行”,如果“女人不会飞行”那么就满足了。所以要把“人” 和“行为” 抽象两个接口,有什么样的行为,实现什么样的接口。
    如 JDK Formatter 
    



代理 Proxy
        这个不用说了,只有上代码。
        //被代理的接口
        public interface Subject {
            void foo();
        }
        //被代理接口的实现
        public class SubjectImpl implements Subject {
            public void foo() {
                System.out.println("foo impl");
            }
        }
        
        //代理
        public class ProxyHandler implements InvocationHandler {
            private Object proxied;

            public ProxyHandler( Object proxied )
            {
                this.proxied = proxied;
            }
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //在转调具体目标对象之前,可以执行一些功能处理
                System.out.println("proxy before");

                //转调具体目标对象的方法
                Object result = method.invoke( proxied, args);

                //在转调具体目标对象之后,可以执行一些功能处理
                System.out.println("proxy after");

                return result;
            }
        }
        
        //测试代码
        public static void main(String[] args) {
            Subject real = new SubjectImpl();
            Subject proxySubject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(),
                    new Class[]{Subject.class},
                    new ProxyHandler(real));
            proxySubject.foo();
        }

        上面的代理实现是通过JDK 的反射方式实现的,也可以通过自己改写class字节码(拼字符串,然后把这个字符串编译成字节码,加载完后就可以使用了)。
        
外观模式 Facade
        为子系统中的一组接口提供一个一致的界面,就是把很多子类的实现封装成统一的接口,外部调用不用关心子类具体实现,只要清楚有接口提供那些功能就行。典型应用就是数据库 JDBC 的应用。
    

你可能感兴趣的:(java设计模式)