当前位置:编程学习 > C/C++ >>

Java中什么是“对已经实现好的数据结构进行包装”

Java中什么是“对已经实现好的数据结构进行包装”?最好给出具体的几个例子,如IO中的包装、类集中的包装等等..................(能说明是怎样包装的更好)。
追问:是不是如果一个类在实例化时把其他的类作为自己的参数来进行实例化,那么这个类就是其他类的包装类?例如A  a = new A(B),那么A就是B的包装类,对不对?
答案:不知道楼上的再瞎写什么。楼主的意思就是说java的封转,做java项目很久了,封装是必备的。

public class user {
   private String name;
   private int age;
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
}
这是一个简单的封转,刚写的。
当你想用user的age的时候就 直接生成一个新的user 然后调用它的 user.getAge();
这样user就成一个封闭的整体了。它有自己的setAge(),有自己的getAge();
其他的人无权操作它的参数,只能通过调用函数来间接的操作,这个思想贯穿所有的java设计程序。
楼主要问的包装还是封装?
封装encapsulation是通过提供对外的公共接口来保护类的内部数据.
包装Wrapping主要是实现已存在类的扩展与变形,方便与其他类进行交互.
封装很好理解吧。。JAVA特性之一.
包装比较常见的形式就是包装类,像Integer类, 主要作用就是将基本类型int包装成一个java类,便于类型的转换和操作,同时也比int更符合面对对象的概念,
java的IO类和集合类中也使用包装,也就是上面有人说过的设计模式之...装饰者模式,即Decorator。
比如 input stream 实际存在四种,
inputStream,FileInputStream,FilterInputStream,BufferedInputStream,使用的场合不一样,但都属于同一种超类的,所以之间可以进行相互修饰.
BufferedInputStream input = new BufferenInputStream(new FileInputStrem("test.txt"))
这行代码就是将一个FileInputStream对象包装(修饰)成了一个BufferedInputStream对象。
集合类里面也存在这种现象,超类都是Collection,所以相互之间可以进行包装
HashSet<String> temp = new HashSet<String>(Array.asList(items));
更详细的可以看一下JAVA设计模式一类的书籍...


 

封装就隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

 

可以使用bean对数据进行包装啊 !只暴露获取 建立的函数!

 

也可以使用XML来进行数据的包装但是相对这样透明些 !但是近些年XML发展的很快

嗯嗯

不就封装嘛

 

比如这样撒

一台电脑 我们只能碰到 开/关

假设下 如果你每次开机都要 插主板 插电源 插内存条啊 什么什么什么的。 那你觉得怎样会更好些呢

OK 你想明白了。我们现在就可以再打个比方了

 

我建了个类 里面有三百个方法

客户端程序员他们只能碰到我其中的一个方法(启动程序)

 如果这样,一个公司做一个项目 总共由一百个类组成。

 那么当需要将这一百个类组合成一个程序的时候、 我们需要看到的只是你类中的一个启动

别的不需要 因为那样只会更复杂

 

就像上面的例子 电脑只有switch

一个完善的设计风格

正是封装

隐藏(priavte)

 

好处是 简单

另外一个是保持自己的知识产权

第三个是写注释文档(doc)的时候呢不会那么复杂 直接告诉调用这个方法就能启动你的类

 

不然像说这样

我定义了三百个方法

有些方法是组合的 有些方法是一个小细节啊 等等等等等等

那人家要找到你几百个方法中的一个启动函数多郁闷呀。。。

 楼主所说应该是指java设计模式中的装饰者模式,即Decorator。

我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的.
使用Decorator 的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator 提供
了"即插即用"的方法,在运行期间决定何时增加何种功能.

举例:

我们先建立一个接口:
public inte易做图ce Work
{
public void insert();
}
接口Work 有一个具体实现:插入方形桩或圆形桩,这两个区别对Decorator 是无所谓.我们以
插入方形桩为例:
public class SquarePeg implements Work{
public void insert(){
System.out.println("方形桩插入");
}
}

现在有一个应用:需要在桩打入前,挖坑,在打入后,在桩上钉木板,这些额外的功能是动态,
可能随意增加调整修改,比如,可能又需要在打桩之后钉架子(只是比喻).

public class Decorator implements Work{
private Work work;
//额外增加的功能被打包在这个List 中
private ArrayList others = new ArrayList();
//在构造器中使用组合new 方式,引入Work 对象;
public Decorator(Work work)
{
this.work=work;
others.add("挖坑");
others.add("钉木板");
}
public void insert(){
newMethod();
}
//在新方法中,我们在insert 之前增加其他方法,这里次序先后是用
户灵活指定的
public void newMethod()
{
otherMethod();
work.insert();
}
public void otherMethod()

{
ListIterator listIterator = others.listIterator();
while (listIterator.hasNext())
{

System.out.println(((String)(listIterator.next()))
+ " 正在进行");
}
}
}

在上例中,我们把挖坑和钉木板都排在了打桩insert 前面,这里只是举例说明额外功能次序
可以任意安排.
好了,Decorator 模式出来了,我们看如何调用:
Work squarePeg = new SquarePeg();
Work decorator = new Decorator(squarePeg);
decorator.insert();
Decorator 模式至此完成.
如果你细心,会发现,上面调用类似我们读取文件时的调用:
FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);

实际上Java 的I/O API 就是使用Decorator 实现的,I/O 变种很多,如果都采取继承方法,
将会产生很多子类,显然相当繁琐.

上一个:如何学好C++和VB?
下一个:c++ c#

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,